"use client";
import Link from "next/link";
import { useRouter } from "next/navigation";
import { useEffect, useState } from "react";
import { useStore, findPatient } from "@/lib/store";
import { membershipActive, membershipPlan, mxn, patientBalance, initials } from "@/lib/logic";
import { PageHead, Pill, Tabs, useUI } from "../ui";
import { ApptForm, NewPatientForm } from "../modals";
import { BudgetsTab, HistoryTab, InsuranceTab, OdontogramTab, PaymentsTab, ProceduresTab, RxTab, StudiesTab } from "./tabs";

type Tab = "historia" | "odonto" | "proc" | "rx" | "estudios" | "pres" | "cobros" | "seguro";

export function PatientView({ id, initialTab }: { id: string; initialTab?: string }) {
  const { s, ctx } = useStore();
  const { open } = useUI();
  const router = useRouter();
  const [tab, setTab] = useState<Tab>((initialTab as Tab) || "historia");
  const [q, setQ] = useState("");
  useEffect(() => { if (initialTab) setTab(initialTab as Tab); }, [initialTab]);
  const p = findPatient(s, id);
  if (!p) return <p>No se encontró al paciente. <Link href="/pacientes">Ver pacientes</Link></p>;

  const tabs: [Tab, string][] = [["historia", "Historia clínica"], ["odonto", "Odontograma"], ["proc", "Tratamientos"], ["rx", "Recetas"], ["estudios", "Radiografías"], ["pres", "Presupuestos"], ["cobros", "Cobros"]];
  if (ctx.insurersOn) tabs.push(["seguro", "Seguro"]);
  const current = tab === "seguro" && !ctx.insurersOn ? "historia" : tab;
  const mp = membershipPlan(p, s.membershipPlans);
  const ins = ctx.insurersOn && p.ins ? s.insurers.find((i) => i.id === p.ins!.insurerId) : null;
  const list = s.patients.filter((x) => x.name.toLowerCase().includes(q.toLowerCase()) || x.tel.replace(/\D/g, "").includes(q.replace(/\D/g, "") || "~"));

  const body = { historia: HistoryTab, odonto: OdontogramTab, proc: ProceduresTab, rx: RxTab, estudios: StudiesTab, pres: BudgetsTab, cobros: PaymentsTab, seguro: InsuranceTab }[current];
  const Body = body;

  return (
    <>
      <PageHead eyebrow="Pacientes" title={p.name}
        sub={<>{p.age} años · {p.sex === "F" ? "Femenino" : "Masculino"} · <span className="mono">{p.tel}</span>{" "}
          {p.hist.alergias && p.hist.alergias !== "Ninguna" && <Pill tone="bad">Alergia: {p.hist.alergias}</Pill>}{" "}
          {mp && <Pill tone={membershipActive(p, s.today) ? "ok" : "warn"}>{mp.name}{membershipActive(p, s.today) ? "" : " · pago vencido"}</Pill>}{" "}
          {ins && <Pill tone="info">{ins.name}</Pill>}</>}>
        <button className="btn" onClick={() => open(<NewPatientForm onCreated={(nid) => router.push(`/pacientes/${nid}`)} />)}>Nuevo paciente</button>
        <button className="btn pri" onClick={() => open(<ApptForm patientId={p.id} date={s.today} />)}>Agendar</button>
      </PageHead>
      <div className="pgrid">
        <div className="panel" style={{ padding: 8, display: "flex", flexDirection: "column", gap: 6 }}>
          <input aria-label="Buscar paciente" placeholder="Buscar por nombre o teléfono" value={q} onChange={(e) => setQ(e.target.value)} />
          <div className="plist">
            {list.map((x) => {
              const due = patientBalance(x, ctx).due;
              return (
                <Link key={x.id} href={`/pacientes/${x.id}`} className="pitem" aria-current={x.id === p.id} style={{ color: "inherit", textDecoration: "none" }}>
                  <span className="av">{initials(x.name)}</span>
                  <span className="meta" style={{ minWidth: 0 }}><b style={{ display: "block" }}>{x.name}</b><small className="muted">{due ? `Saldo ${mxn(due)}` : "Sin saldo"}</small></span>
                </Link>
              );
            })}
            {!list.length && <span className="empty">Sin resultados.</span>}
          </div>
        </div>
        <div className="panel" style={{ display: "flex", flexDirection: "column", gap: 14 }}>
          <Tabs tabs={tabs} value={current} onChange={setTab} />
          <Body key={`${p.id}-${current}`} p={p} />
        </div>
      </div>
    </>
  );
}
