// Main App + path router with legacy hash compatibility.

function App() {
  const [route, setRoute] = React.useState(() => readRoute());

  React.useEffect(() => {
    migrateLegacyHashRoute();
    const sync = () => setRoute(readRoute());
    window.addEventListener("popstate", sync);
    window.addEventListener("hashchange", sync);
    return () => {
      window.removeEventListener("popstate", sync);
      window.removeEventListener("hashchange", sync);
    };
  }, []);

  React.useEffect(() => {
    if (route.projectId && route.projectId !== "new" && window.GGGApi?.setActiveProjectId) {
      window.GGGApi.setActiveProjectId(route.projectId);
    }
  }, [route.projectId]);

  const go = (name, projectId) => {
    const path = buildPath(name, projectId);
    window.history.pushState({}, "", path);
    setRoute(readRoute());
    window.scrollTo({ top: 0, behavior: "instant" });
  };

  const renderRoute = () => {
    switch (route.name) {
      case "landing":   return <Landing go={go} route={route} />;
      case "login":     return <Auth go={go} mode="login" route={route} />;
      case "register":  return <Auth go={go} mode="register" route={route} />;
      case "forgot":    return <Auth go={go} mode="forgot" route={route} />;
      case "company-profile": return <CompanyProfile go={go} route={route} />;
      case "dashboard": return <Dashboard go={go} route={route} />;
      case "project":   return <Project go={go} route={route} />;
      case "project-edit": return <Wizard go={go} route={route} projectId={route.projectId === "new" ? "" : route.projectId} />;
      case "document":  return <Files go={go} route={route} />;
      case "report":    return <Report go={go} route={route} />;
      case "special":   return <Special go={go} route={route} />;
      case "tasks":     return <Tasks go={go} route={route} />;
      case "credits":   return <Credits go={go} route={route} />;
      case "users":     return <Users go={go} route={route} />;
      case "settings":  return <Settings go={go} route={route} />;
      default:          return <Landing go={go} route={route} />;
    }
  };

  return (
    <>
      {renderRoute()}
      {window.LiveStatusDock ? <LiveStatusDock /> : null}
    </>
  );
}

function readRoute() {
  const pathParts = window.location.pathname.split("/").filter(Boolean).map(decodeURIComponent);
  if (!pathParts.length) {
    const hash = legacyHashRoute();
    return hash || { name: "landing", path: "/" };
  }
  const [root, second] = pathParts;
  const path = "/" + pathParts.join("/");
  const activeProjectId = second || "";
  const map = {
    dashboard: "dashboard",
    login: "login",
    register: "register",
    forgot: "forgot",
    "company-profile": "company-profile",
    project: second ? "project-edit" : "project",
    document: "document",
    report: "report",
    special: "special",
    tasks: "tasks",
    credits: "credits",
    users: "users",
    settings: "settings"
  };
  return {
    name: map[root] || "landing",
    path,
    projectId: ["project", "document", "report", "tasks"].includes(root) ? activeProjectId : "",
    userId: root === "users" ? second || "" : "",
    mode: root === "credits" ? second || "wallet" : ""
  };
}

function buildPath(name, projectId) {
  const activeId = projectId || window.GGGApi?.getActiveProjectId?.() || "";
  const projectSuffix = activeId ? `/${encodeURIComponent(activeId)}` : "";
  const map = {
    landing: "/",
    login: "/login",
    register: "/register",
    forgot: "/forgot",
    "company-profile": "/company-profile",
    dashboard: "/dashboard",
    project: projectId ? `/project/${encodeURIComponent(projectId)}` : "/project",
    "project-new": "/project/new",
    wizard: projectId ? `/project/${encodeURIComponent(projectId)}` : "/project/new",
    files: `/document${projectSuffix}`,
    document: `/document${projectSuffix}`,
    report: `/report${projectSuffix}`,
    special: "/special",
    expert: `/tasks${projectSuffix}`,
    tasks: `/tasks${projectSuffix}`,
    credits: "/credits",
    "credits-admin": "/credits/admin",
    users: "/users",
    "user-detail": projectId ? `/users/${encodeURIComponent(projectId)}` : "/users",
    settings: "/settings"
  };
  return map[name] || (String(name).startsWith("/") ? name : `/${name}`);
}

function legacyHashRoute() {
  const hash = (window.location.hash || "").replace(/^#\/?/, "").split("?")[0];
  if (!hash) return null;
  if (hash === "wizard") return { name: "project-edit", path: "/project/new", projectId: "new" };
  if (hash === "files") return { name: "document", path: "/document", projectId: "" };
  if (hash === "expert") return { name: "tasks", path: "/tasks", projectId: "" };
  const legacyMap = {
    landing: "/",
    login: "/login",
    register: "/register",
    forgot: "/forgot",
    "company-profile": "/company-profile",
    dashboard: "/dashboard",
    report: "/report",
    special: "/special",
    credits: "/credits",
    users: "/users",
    settings: "/settings"
  };
  const path = legacyMap[hash] || `/${hash}`;
  const root = path.split("/").filter(Boolean)[0] || "landing";
  return { name: root === "document" ? "document" : root === "tasks" ? "tasks" : root, path, projectId: "" };
}

function migrateLegacyHashRoute() {
  const hash = (window.location.hash || "").replace(/^#\/?/, "").split("?")[0];
  if (!hash || window.location.pathname !== "/") return;
  const path = buildPath(hash === "files" ? "document" : hash === "expert" ? "tasks" : hash === "wizard" ? "project-new" : hash);
  window.history.replaceState({}, "", path);
}

ReactDOM.createRoot(document.getElementById("root")).render(<App />);
