// Navigation primitives for the single-phone prototype.
//
// route = { stack: ['home', 'find'], tab: 'home', sheet: null }
// - stack: drill-in screens, top is current; tab base is stack[0]
// - tab: current bottom-nav tab (changes reset stack)
// - sheet: modal sheet name, rendered on top, null when closed

const RouterCtx = React.createContext(null);

function useRouter() { return React.useContext(RouterCtx); }

function RouterProvider({ children, initial = 'splash' }) {
  const [route, setRoute] = React.useState({
    stack: [initial],
    tab: null,           // null while in pre-app flow; FabNav reads SCREEN_TO_TAB at render
    sheet: null,
    transition: 'fade',
    transitionKey: 0,
  });

  // Track in-flight transitions to drive enter animations.
  const api = React.useMemo(() => ({
    route,
    current: route.stack[route.stack.length - 1],

    // Push a detail screen onto the stack
    go: (screen, opts = {}) => setRoute((r) => ({
      ...r, stack: [...r.stack, screen], sheet: null,
      transition: opts.transition || 'push', transitionKey: r.transitionKey + 1,
    })),

    // Pop one
    back: () => setRoute((r) => ({
      ...r,
      stack: r.stack.length > 1 ? r.stack.slice(0, -1) : r.stack,
      sheet: null,
      transition: 'pop', transitionKey: r.transitionKey + 1,
    })),

    // Switch tab — resets stack to the tab's root screen
    tab: (tab) => setRoute((r) => {
      const tabRoots = { home: 'home', drive: 'vehicle', service: 'service', you: 'profile' };
      const newRoot = tabRoots[tab] || 'home';
      if (r.tab === tab && r.stack.length === 1) return r;
      return { ...r, tab, stack: [newRoot], sheet: null, transition: 'fade', transitionKey: r.transitionKey + 1 };
    }),

    // Replace root (e.g. exit onboarding into the app)
    replace: (screen, tab = 'home') => setRoute((r) => ({
      stack: [screen], tab, sheet: null, transition: 'fade', transitionKey: r.transitionKey + 1,
    })),

    // Sheets
    openSheet: (sheet, props = {}) => setRoute((r) => ({ ...r, sheet, sheetProps: props })),
    closeSheet: () => setRoute((r) => ({ ...r, sheet: null, sheetProps: undefined })),
  }), [route]);

  return <RouterCtx.Provider value={api}>{children}</RouterCtx.Provider>;
}

window.RouterCtx = RouterCtx;
window.useRouter = useRouter;
window.RouterProvider = RouterProvider;
