import Link from "next/link";
import { prisma } from "@/lib/prisma";
import { requireAgency } from "@/lib/auth";
import { formatDate, money } from "@/lib/format";
import {
  generateDueInvoices,
  invoiceStatusClass,
  invoiceStatusLabel,
  INVOICE_STATUS,
  paymentMethodLabel,
} from "@/lib/invoices";
import InvoiceSubmitModal from "./InvoiceSubmitModal";

export default async function AgencyInvoicesPage() {
  const { agency } = await requireAgency();
  await generateDueInvoices();

  const invoices = await prisma.invoice.findMany({
    where: { agencyId: agency.id },
    orderBy: { number: "desc" },
  });

  const pending = invoices.filter((i) => i.status !== INVOICE_STATUS.PAID);

  return (
    <div className="space-y-6">
      <div>
        <h1 className="text-2xl font-bold">Facturas</h1>
        <p className="text-slate-500">
          Facturas de licencia generadas según tu calendario de facturación. Envía tu comprobante
          para que el administrador revise el pago.
        </p>
      </div>

      {pending.length > 0 && agency.status === "SUSPENDED" ? (
        <div className="rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-800">
          Tienes {pending.length} factura(s) pendiente(s). Realiza el pago para reactivar tu
          licencia una vez aprobada por el administrador.
        </div>
      ) : null}

      <div className="card p-5">
        {invoices.length === 0 ? (
          <p className="text-sm text-slate-400">
            Aún no tienes facturas. Se generarán automáticamente en tu día de facturación
            configurado.
          </p>
        ) : (
          <div className="overflow-x-auto">
            <table className="w-full text-sm">
              <thead className="text-left text-slate-500">
                <tr className="border-b border-slate-200">
                  <th className="py-2 pr-3">No.</th>
                  <th className="py-2 pr-3">Fecha de corte</th>
                  <th className="py-2 pr-3">Licencia</th>
                  <th className="py-2 pr-3 text-right">Costo</th>
                  <th className="py-2 pr-3">Estatus</th>
                  <th className="py-2 pr-3">Comprobante</th>
                  <th className="py-2 text-right">Acción</th>
                </tr>
              </thead>
              <tbody>
                {invoices.map((inv) => (
                  <tr key={inv.id} className="border-b border-slate-100">
                    <td className="py-3 pr-3 font-medium">#{inv.number}</td>
                    <td className="py-3 pr-3">{formatDate(inv.cutoffDate)}</td>
                    <td className="py-3 pr-3">{inv.licenseName ?? "—"}</td>
                    <td className="py-3 pr-3 text-right">
                      <div>{money(inv.costMxn)}</div>
                      <div className="text-xs text-slate-400">
                        {money(inv.priceUsd, "USD")} · TC {inv.exchangeRate.toFixed(2)}
                      </div>
                    </td>
                    <td className="py-3 pr-3">
                      <span className={`badge ${invoiceStatusClass(inv.status)}`}>
                        {invoiceStatusLabel(inv.status)}
                      </span>
                      {inv.paymentMethod ? (
                        <div className="mt-1 text-xs text-slate-400">
                          {paymentMethodLabel(inv.paymentMethod)}
                        </div>
                      ) : null}
                    </td>
                    <td className="py-3 pr-3">
                      {inv.receiptUrl ? (
                        <Link
                          href={inv.receiptUrl}
                          target="_blank"
                          className="text-blue-600 hover:underline"
                        >
                          Ver
                        </Link>
                      ) : (
                        <span className="text-slate-400">—</span>
                      )}
                    </td>
                    <td className="py-3 text-right">
                      {inv.status === INVOICE_STATUS.UNPAID ? (
                        <InvoiceSubmitModal
                          invoiceId={inv.id}
                          invoiceNumber={inv.number}
                          amountMxn={inv.costMxn}
                        />
                      ) : inv.status === INVOICE_STATUS.PENDING ? (
                        <span className="text-xs text-blue-600">En revisión</span>
                      ) : (
                        <span className="text-xs text-emerald-600">
                          Pagada {inv.paidAt ? formatDate(inv.paidAt) : ""}
                        </span>
                      )}
                    </td>
                  </tr>
                ))}
              </tbody>
            </table>
          </div>
        )}
      </div>
    </div>
  );
}
