/* ============================================================
   App — router, state, adopt flow glue
   ============================================================ */
function App() {
  const [route, setRoute] = useState({ name: "home", params: {} });
  const [parcels, setParcels] = useState(() => DATA.PARCELS.map(p => ({ ...p, cells: p.cells.map(c => ({ ...c })) })));
  const [cart, setCart] = useState([]);
  const [user, setUser] = useState(null);
  const [mobileNav, setMobileNav] = useState(false);
  const [order, setOrder] = useState(null);
  const [toast, setToast] = useState(null);

  const go = (name, params = {}) => {
    setRoute({ name, params });
    window.scrollTo({ top: 0, behavior: "instant" });
  };

  const totals = useMemo(() => {
    const t = HELP.countStatus(parcels);
    // pad adopted to feel like a real org
    return { ...t, adopted: t.adopted + 1860 };
  }, [parcels]);

  const showToast = (msg) => { setToast(msg); clearTimeout(window.__tt); window.__tt = setTimeout(() => setToast(null), 2600); };

  const onAdopt = (cell, parcel) => {
    if (cart.some(c => c.cellId === cell.id)) return;
    setCart([...cart, {
      cellId: cell.id, label: `R${cell.row + 1}·C${cell.col + 1}`,
      species: cell.species.name, parcelName: parcel.name, parcelId: parcel.id,
    }]);
    showToast(`${cell.species.name} (R${cell.row + 1}·C${cell.col + 1}) adăugat în coș`);
  };

  const completeOrder = (info) => {
    // mark cells adopted
    const ids = cart.map(c => c.cellId);
    setParcels(prev => prev.map(p => ({
      ...p,
      cells: p.cells.map(c => ids.includes(c.id) ? { ...c, status: info.method === "transfer" ? "reserved" : "adopted" } : c),
    })));
    const o = { id: "ADT-" + (2042 + Math.floor(Math.random() * 50)), ...info };
    setOrder(o);
    setCart([]);
    go("confirm");
  };

  const setCellStatus = (pid, cellId, status) => {
    setParcels(prev => prev.map(p => p.id !== pid ? p : {
      ...p, cells: p.cells.map(c => c.id === cellId ? { ...c, status } : c),
    }));
  };
  // recompute parcel aggregate counts
  const parcelsWithCounts = useMemo(() => parcels.map(p => {
    const adopted = p.cells.filter(c => c.status === "adopted" || c.status === "review").length;
    const reserved = p.cells.filter(c => c.status === "reserved").length;
    const available = p.cells.filter(c => c.status === "available").length;
    return { ...p, adopted, reserved, available };
  }), [parcels]);

  const onLogin = (u) => { setUser(u); go("profile"); };

  const getParcel = (id) => parcelsWithCounts.find(p => p.id === id);

  // find a cell for tree detail
  const findCell = () => {
    const { parcelId, id, cellId, cellRef } = route.params;
    const parcel = getParcel(parcelId) || parcelsWithCounts[0];
    let cell = null;
    if (cellId) cell = parcel.cells.find(c => c.id === cellId);
    if (!cell && id) {
      for (const p of parcelsWithCounts) { const f = p.cells.find(c => c.treeId === id); if (f) return { parcel: p, cell: f }; }
    }
    if (!cell) cell = parcel.cells.find(c => c.status === "adopted");
    return { parcel, cell };
  };

  const isAdmin = route.name === "admin";
  let content;
  switch (route.name) {
    case "home": content = <Landing go={go} parcels={parcelsWithCounts} totals={totals} />; break;
    case "parcels": content = <ParcelsList go={go} parcels={parcelsWithCounts} />; break;
    case "parcel": content = <ParcelView go={go} parcel={getParcel(route.params.id)} onAdopt={onAdopt} cart={cart} />; break;
    case "tree": { const { parcel, cell } = findCell(); content = <TreeDetail go={go} parcel={parcel} cell={cell} />; break; }
    case "checkout": content = <Checkout go={go} cart={cart} setCart={setCart} completeOrder={completeOrder} user={user} />; break;
    case "confirm": content = <Confirmation go={go} order={order || { id: "ADT-2042", method: "card", count: 1 }} />; break;
    case "profile": content = <Profile go={go} user={user} />; break;
    case "gridgen": content = <GridGen go={go} />; break;
    case "about": content = <About go={go} totals={totals} />; break;
    case "login": content = <Login go={go} onLogin={onLogin} />; break;
    case "admin": content = <Admin go={go} parcels={parcelsWithCounts} totals={totals} setCellStatus={setCellStatus} />; break;
    default: content = <Landing go={go} parcels={parcelsWithCounts} totals={totals} />;
  }

  return (
    <React.Fragment>
      {!isAdmin && <Header route={route} go={go} cartCount={cart.length} user={user} onMenu={() => setMobileNav(true)} />}
      {content}
      {!isAdmin && <Footer go={go} />}
      <MobileNav open={mobileNav} close={() => setMobileNav(false)} go={go} user={user} />
      {toast && (
        <div className="toast">
          <span style={{ width: 30, height: 30, borderRadius: 9, background: "var(--green)", color: "#fff", display: "grid", placeItems: "center", flex: "none" }}><Icon name="check" size={17} stroke={2.5} /></span>
          <span style={{ fontSize: 14, fontWeight: 600 }}>{toast}</span>
          <button className="btn btn-soft btn-sm" onClick={() => go("checkout")} style={{ marginLeft: 6 }}>Vezi coșul</button>
        </div>
      )}
    </React.Fragment>
  );
}

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