import { notFound } from "next/navigation";
import { CaseForm } from "@/components/CaseForm";
import { StageForm } from "@/components/StageForm";
import { Timeline } from "@/components/Timeline";
import { reissueCode } from "@/lib/actions";
import { specialtyTitle, stageById } from "@/lib/catalog";
import { getCase, latestCode } from "@/lib/cases";
import { formatDay, formatTehran } from "@/lib/format";
import { patientUrl, smsConfigured } from "@/lib/sms";
import { buildTrack, currentStageId, nextStageId } from "@/lib/track";

export const metadata = { title: "پرونده" };

function day(value: string | null) {
  return formatDay(value, "fa") || "ندارد";
}

export default async function StaffCasePage({ params }: { params: Promise<{ id: string }> }) {
  const { id: raw } = await params;
  const id = Number(raw);
  if (!Number.isInteger(id)) notFound();
  const record = getCase(id);
  if (!record) notFound();
  const code = latestCode(id);
  const smsOn = smsConfigured();
  const now = new Date().toISOString();
  const codeActive = Boolean(code && !code.used_at && code.expires_at > now && code.visible_to_staff && code.code_plain);
  const codeExpired = Boolean(code && !code.used_at && code.expires_at <= now);
  const link = patientUrl(record.public_token);
  const track = buildTrack(record.events, record.language, "fa");
  const current = stageById(currentStageId(record.events));

  return (
    <div className="stack">
      <section className="card">
        <p className="muted">{record.case_number}</p>
        <h1>{record.first_name} {record.last_name}</h1>
        <p>{specialtyTitle(record.specialty_id, "fa")} ({record.specialty_id ? specialtyTitle(record.specialty_id, "en") : ""})</p>
        <p>مرحله فعلی: {current?.title.fa ?? "ندارد"}</p>
      </section>

      <section className="card stack" data-testid="sms-panel">
        <h2>پیامک و ورود بیمار</h2>
        {!smsOn ? (
          <aside className="banner">
            <strong>پیامک واقعی خاموش است.</strong>
            <p>
              هیچ شرکتی برای پیامک انتخاب نشده و درخواستی به بیرون فرستاده نمی‌شود. متن پیام روی پرونده ذخیره شده است.
              کد زیر فقط برای آزمایش ورود بیمار روی همین صفحه دیده می‌شود. خود لینک پرونده را باز نمی‌کند.
            </p>
            {codeActive ? (
              <>
                <p className="code" data-testid="patient-code">{code?.code_plain}</p>
                <p>اعتبار تا {formatTehran(code!.expires_at, "fa")} به وقت تهران.</p>
              </>
            ) : (
              <p>{codeExpired ? "این کد منقضی شده است." : "کد فعالی روی صفحه نیست."} کد تازه صادر کنید.</p>
            )}
          </aside>
        ) : (
          <p className={record.sms_status === "sent" ? "alert ok" : "alert"}>
            {record.sms_status === "sent"
              ? `پیامک ارسال شد${record.sms_attempted_at ? ` در ${formatTehran(record.sms_attempted_at, "fa")}` : ""}. کد روی این صفحه نشان داده نمی‌شود.`
              : record.sms_status === "failed"
                ? `ارسال پیامک ناموفق بود${record.sms_error ? `: ${record.sms_error}` : ""}.`
                : "پیامک هنوز ارسال نشده است."}
          </p>
        )}
        {smsOn && codeActive ? (
          <p>کد تازه صادر شده و پیامک نشده است، چون پیامک فقط هنگام ساخت پرونده می‌رود: <span className="code">{code?.code_plain}</span></p>
        ) : null}
        <p>وضعیت پیامک: {record.sms_status === "sent" ? "ارسال‌شده" : record.sms_status === "failed" ? "ناموفق" : "ارسال‌نشده"}</p>
        <h3>لینک بیمار</h3>
        <p className="pre" data-testid="patient-link">{link}</p>
        <h3>متن ذخیره‌شده پیامک</h3>
        <p className="pre">{record.sms_text}</p>
        <form action={reissueCode}>
          <input type="hidden" name="id" value={record.id} />
          <button className="secondary" type="submit">صدور کد تازه</button>
        </form>
        <p className="hint">کد تازه پیامک نمی‌شود. اعتبار پیش‌فرض کد ۱۰ دقیقه است.</p>
      </section>

      <section className="pair">
        <div className="card">
          <h2>خط زمان</h2>
          <p className="hint">بیمار این روند را به زبان پرونده می‌بیند. عنوان‌ها اینجا فارسی است.</p>
          <Timeline items={track} />
        </div>
        <div className="card">
          <h2>تاریخ‌های ثابت</h2>
          <ul className="dates">
            <li>
              <span>تاریخ ورود به ایران</span>
              <strong>{day(record.arrived_iran_on)}</strong>
              <small>هم‌ردیف مرحله «ورود به ایران ثبت شد»</small>
            </li>
            <li>
              <span>تاریخ مراجعه به شرکت ایران هلث</span>
              <strong>{day(record.visited_company_on)}</strong>
              <small>هم‌ردیف مرحله «مراجعه به ایران هلث ثبت شد»</small>
            </li>
            <li>
              <span>تاریخ مراجعه به مرکز درمانی</span>
              <strong>{day(record.visited_center_on)}</strong>
              <small>هم‌ردیف مرحله «پذیرش در مرکز درمانی ثبت شد»</small>
            </li>
            <li>
              <span>تاریخ خروج از ایران</span>
              <strong>{day(record.departed_iran_on)}</strong>
              <small>هم‌ردیف مرحله «خروج از ایران ثبت شد»</small>
            </li>
          </ul>
          <h3>تاریخ‌های دیگر مسیر</h3>
          {record.pathDates.length === 0 ? <p className="hint">موردی ثبت نشده است.</p> : (
            <ul className="dates">
              {record.pathDates.map((item) => (
                <li key={`${item.title}-${item.eventDate}`}>
                  <span>{item.title}</span>
                  <strong>{formatDay(item.eventDate, "fa")}</strong>
                </li>
              ))}
            </ul>
          )}
          {record.center_name ? <p>مرکز درمانی: {record.center_name}</p> : null}
        </div>
      </section>

      <section className="card stack">
        <h2>ثبت مرحله</h2>
        <StageForm caseId={record.id} language={record.language} suggestedStageId={nextStageId(record.events)} />
      </section>

      <section className="card stack">
        <h2>ویرایش پرونده</h2>
        <CaseForm
          mode="edit"
          initial={{
            id: record.id,
            firstName: record.first_name,
            lastName: record.last_name,
            mobile: record.mobile,
            language: record.language,
            country: record.country,
            city: record.city,
            specialtyId: record.specialty_id,
            requested: record.requested,
            received: record.received,
            centerName: record.center_name,
            summary: record.summary,
            arrived: record.arrived_iran_on ?? "",
            visitedCompany: record.visited_company_on ?? "",
            visitedCenter: record.visited_center_on ?? "",
            departed: record.departed_iran_on ?? "",
            internalNote: record.internal_note,
            pathDates: record.pathDates,
          }}
        />
      </section>
    </div>
  );
}
