import { documentLabel } from "../../../../lib/document-labels.ts";
import Link from "next/link";
import { notFound } from "next/navigation";
import { env } from "../../../../lib/server-env";
import { getAdmin } from "../../../../lib/admin-auth";
import { applicationStatusLabel } from "../../../../lib/application-status";
import {
  communicationTemplateLabel,
  documentStatusLabel,
  emailErrorLabel,
} from "../../../../lib/admin-labels";
import { DeleteApplicationButton } from "../../../../components/DeleteApplicationButton";

type Application = {
  id: string;
  public_number: string;
  status: string;
  submitted_at: string;
  response_name: string;
  full_name: string;
  birth_date: string;
  address: string;
  postal_code: string;
  locality: string;
  tax_number: string;
  social_security_number: string;
};
type Guardian = {
  id: string;
  role: string;
  full_name: string;
  phone: string;
  email: string;
};
type Member = {
  id: string;
  full_name: string;
  relationship: string;
  monthly_net_income_cents: number;
};
type Doc = {
  id: string;
  type: string;
  original_name: string;
  size_bytes: number;
  review_status: string;
};
type Generated = { id: string; original_name: string; size_bytes: number };
type History = {
  from_status: string;
  to_status: string;
  reason: string;
  created_at: string;
};
type Note = { author_user_id: string; body: string; created_at: string };
type DocRequest = {
  recipient: string;
  message: string;
  status: string;
  created_at: string;
};
type Communication = {
  recipient: string;
  template_key: string;
  status: string;
  attempts: number;
  last_error_code: string | null;
  sent_at: string | null;
  created_at: string;
};
export const metadata = {
  title: "Detalhe da candidatura",
  robots: { index: false, follow: false },
};
const date = (value: string) =>
  new Intl.DateTimeFormat("pt-PT", {
    dateStyle: "short",
    timeStyle: "short",
  }).format(new Date(value));

export default async function ApplicationDetail({
  params,
  searchParams,
}: {
  params: Promise<{ id: string }>;
  searchParams: Promise<{ documents?: string; notification?: string }>;
}) {
  const admin = await getAdmin();
  if (!admin)
    return (
      <main id="conteudo" className="admin-gate">
        <div>
          <h1>Acesso não autorizado.</h1>
          <Link href="/administracao">Voltar</Link>
        </div>
      </main>
    );
  const { id } = await params,
    { documents: documentMessage, notification } = await searchParams;
  const application = await env.DB.prepare(
    "SELECT a.id,a.public_number,a.status,a.submitted_at,s.name response_name,c.full_name,c.birth_date,c.address,c.postal_code,c.locality,c.tax_number,c.social_security_number FROM applications a JOIN children c ON c.application_id=a.id JOIN social_responses s ON s.id=a.social_response_id WHERE a.id=? AND a.deleted_at IS NULL",
  )
    .bind(id)
    .first<Application>();
  if (!application) notFound();
  const [
    guardians,
    members,
    docs,
    history,
    generated,
    notes,
    requests,
    communications,
  ] = await Promise.all([
    env.DB.prepare(
      "SELECT id,role,full_name,phone,email FROM guardians WHERE application_id=? ORDER BY is_education_guardian DESC",
    )
      .bind(id)
      .all<Guardian>(),
    env.DB.prepare(
      "SELECT id,full_name,relationship,monthly_net_income_cents FROM household_members WHERE application_id=? ORDER BY position",
    )
      .bind(id)
      .all<Member>(),
    env.DB.prepare(
      "SELECT id,type,original_name,size_bytes,review_status FROM documents WHERE application_id=? ORDER BY created_at",
    )
      .bind(id)
      .all<Doc>(),
    env.DB.prepare(
      "SELECT from_status,to_status,reason,created_at FROM application_status_history WHERE application_id=? ORDER BY created_at DESC",
    )
      .bind(id)
      .all<History>(),
    env.DB.prepare(
      "SELECT id,original_name,size_bytes FROM generated_files WHERE application_id=? ORDER BY created_at DESC",
    )
      .bind(id)
      .all<Generated>(),
    env.DB.prepare(
      "SELECT author_user_id,body,created_at FROM application_notes WHERE application_id=? ORDER BY created_at DESC",
    )
      .bind(id)
      .all<Note>(),
    env.DB.prepare(
      "SELECT recipient,message,status,created_at FROM document_requests WHERE application_id=? ORDER BY created_at DESC",
    )
      .bind(id)
      .all<DocRequest>(),
    env.DB.prepare(
      "SELECT recipient,template_key,status,attempts,last_error_code,sent_at,created_at FROM communications WHERE application_id=? ORDER BY created_at DESC",
    )
      .bind(id)
      .all<Communication>(),
  ]);
  return (
    <main id="conteudo" className="admin-shell">
      <div className="admin-back">
        <Link href="/administracao">← Todas as inscrições</Link>
      </div>
      <header className="application-heading">
        <div>
          <p className="eyebrow">{application.public_number}</p>
          <h1>{application.full_name}</h1>
          <p>
            {application.response_name} · recebida em{" "}
            {date(application.submitted_at)}
          </p>
        </div>
        <span
          className={`status-pill status-${application.status.toLowerCase()}`}
        >
          {applicationStatusLabel(application.status)}
        </span>
      </header>
      {documentMessage && (
        <p
          className={`admin-alert ${documentMessage === "queued" ? "success" : "error"}`}
        >
          {documentMessage === "queued"
            ? "Pedido de documentos registado para envio."
            : "O pedido ficou registado, mas o email falhou. Verifique o SMTP."}
        </p>
      )}
      {notification && (
        <p
          className={`admin-alert ${notification === "queued" ? "success" : "error"}`}
        >
          {notification === "queued"
            ? "Notificação administrativa registada para envio."
            : "Não foi possível enviar a notificação. Consulte o erro em Comunicações e confirme as variáveis SMTP."}
        </p>
      )}
      <div className="admin-detail-grid">
        <div>
          <section className="admin-card">
            <h2>Criança</h2>
            <dl>
              <div>
                <dt>Nascimento</dt>
                <dd>{application.birth_date}</dd>
              </div>
              <div>
                <dt>Morada</dt>
                <dd>
                  {application.address}, {application.postal_code}{" "}
                  {application.locality}
                </dd>
              </div>
              <div>
                <dt>NIF</dt>
                <dd>{application.tax_number}</dd>
              </div>
              <div>
                <dt>NISS</dt>
                <dd>{application.social_security_number}</dd>
              </div>
            </dl>
          </section>
          <section className="admin-card">
            <h2>Responsáveis</h2>
            {guardians.results.map((item) => (
              <div className="admin-person" key={item.id}>
                <strong>{item.full_name}</strong>
                <span>{item.role}</span>
                <a href={`tel:${item.phone}`}>{item.phone}</a>
                <a href={`mailto:${item.email}`}>{item.email}</a>
              </div>
            ))}
          </section>
          <section className="admin-card">
            <h2>Agregado</h2>
            {members.results.map((item) => (
              <div className="admin-member" key={item.id}>
                <span>
                  {item.full_name} · {item.relationship}
                </span>
                <strong>
                  {(item.monthly_net_income_cents / 100).toLocaleString(
                    "pt-PT",
                    { style: "currency", currency: "EUR" },
                  )}
                </strong>
              </div>
            ))}
          </section>
          <section className="admin-card">
            <h2>Notas internas</h2>
            <form action={`/api/admin/applications/${id}/notes`} method="post">
              <textarea
                aria-label="Nota interna"
                name="body"
                placeholder="Nota visível apenas à equipa administrativa"
                required
              />
              <button className="button">Adicionar nota</button>
            </form>
            {notes.results.map((item, index) => (
              <div className="history-item" key={index}>
                <strong>{item.author_user_id}</strong>
                <span>{date(item.created_at)}</span>
                <p>{item.body}</p>
              </div>
            ))}
          </section>
          <section className="admin-card">
            <h2>Comunicações</h2>
            <p className="admin-help">
              Envia à equipa administrativa um aviso de nova inscrição, com
              ligação direta para esta candidatura. Não reenvia o comprovativo à
              família.
            </p>
            <form
              action={`/api/admin/applications/${id}/resend-notification`}
              method="post"
            >
              <button className="button">
                Reenviar notificação administrativa
              </button>
            </form>
            {communications.results.map((item, index) => (
              <div className="history-item" key={index}>
                <strong>
                  {communicationTemplateLabel(item.template_key)} ·{" "}
                  {applicationStatusLabel(item.status)}
                </strong>
                <span>
                  {item.sent_at ? date(item.sent_at) : date(item.created_at)}
                </span>
                <p>
                  {item.recipient} · {item.attempts} tentativa(s)
                  {item.last_error_code
                    ? ` · ${emailErrorLabel(item.last_error_code)}`
                    : ""}
                </p>
              </div>
            ))}
          </section>
        </div>
        <aside>
          <section className="admin-card">
            <h2>Alterar estado</h2>
            <form action={`/api/admin/applications/${id}/status`} method="post">
              <select
                aria-label="Estado"
                name="status"
                defaultValue={application.status}
              >
                {[
                  "SUBMITTED",
                  "UNDER_REVIEW",
                  "INCOMPLETE",
                  "ADMITTED",
                  "WAITLIST",
                  "REJECTED",
                ].map((item) => (
                  <option key={item} value={item}>
                    {applicationStatusLabel(item)}
                  </option>
                ))}
              </select>
              <textarea
                aria-label="Motivo da alteração"
                name="reason"
                placeholder="Motivo ou nota da alteração"
                required
              />
              <button className="button">Guardar estado</button>
            </form>
          </section>
          <section className="admin-card">
            <h2>Pedir documentos</h2>
            <form
              action={`/api/admin/applications/${id}/request-documents`}
              method="post"
            >
              <textarea
                aria-label="Documentos em falta"
                name="message"
                placeholder="Indique os documentos em falta e como devem ser entregues."
                required
              />
              <button className="button">Registar e enviar email</button>
            </form>
            {requests.results.map((item, index) => (
              <div className="history-item" key={index}>
                <strong>{item.status}</strong>
                <span>{date(item.created_at)}</span>
                <p>
                  {item.recipient}
                  <br />
                  {item.message}
                </p>
              </div>
            ))}
          </section>
          <section className="admin-card">
            <h2>Ficha de aluno</h2>
            <a
              className="admin-document"
              href={`/api/admin/applications/${id}/pdf`}
              target="_blank"
              rel="noreferrer"
            >
              <span>
                <strong>
                  {generated.results.length
                    ? "Abrir PDF da inscrição"
                    : "Gerar PDF da inscrição"}
                </strong>
                <small>
                  {generated.results.length
                    ? `${generated.results[0].original_name} · ${(generated.results[0].size_bytes / 1024).toFixed(0)} KB`
                    : "Será criado a partir dos dados guardados."}
                </small>
              </span>
              <b>↗</b>
            </a>
            {generated.results.length > 0 && (
              <form action={`/api/admin/applications/${id}/pdf`} method="post">
                <button>Regenerar PDF com o modelo atual</button>
              </form>
            )}
          </section>
          <section className="admin-card">
            <h2>Documentos</h2>
            {docs.results.map((doc) => (
              <div className="admin-document-row" key={doc.id}>
                <a
                  className="admin-document"
                  href={`/api/admin/documents/${doc.id}`}
                >
                  <span>
                    {doc.original_name}
                    <small>
                      {documentLabel(doc.type)} ·{" "}
                      {(doc.size_bytes / 1024 / 1024).toFixed(1)} MB ·{" "}
                      {documentStatusLabel(doc.review_status)}
                    </small>
                  </span>
                  <b>↓</b>
                </a>
                <form
                  action={`/api/admin/documents/${doc.id}/review`}
                  method="post"
                >
                  <select
                    aria-label="Estado"
                    name="status"
                    defaultValue={doc.review_status}
                  >
                    <option value="RECEIVED">Recebido</option>
                    <option value="ACCEPTED">Aceite</option>
                    <option value="REJECTED">Rejeitado</option>
                  </select>
                  <button>Guardar</button>
                </form>
              </div>
            ))}
          </section>
          <section className="admin-card">
            <h2>Histórico</h2>
            {history.results.map((item, index) => (
              <div className="history-item" key={index}>
                <strong>{applicationStatusLabel(item.to_status)}</strong>
                <span>{date(item.created_at)}</span>
                <p>{item.reason}</p>
              </div>
            ))}
          </section>
          <section className="admin-card danger-zone">
            <h2>Eliminar</h2>
            <p>
              Remove a inscrição desta lista, mantendo os dados preservados para
              eventual recuperação administrativa.
            </p>
            <DeleteApplicationButton
              applicationId={id}
              reference={application.public_number}
            />
          </section>
        </aside>
      </div>
    </main>
  );
}
