import Link from "next/link";
import { cookies } from "next/headers";
import { redirect } from "next/navigation";
import { createClient as createSupabaseClient } from "@supabase/supabase-js";
import ReceiptAutoPrintClient from "@/components/client-portal/ReceiptAutoPrintClient";
import { getClientPortalOrderDetails } from "@/lib/client-portal-order-details";

function formatMoney(value: number | null | undefined) {
  return new Intl.NumberFormat("pt-BR", {
    style: "currency",
    currency: "BRL",
  }).format(Number(value || 0));
}

function formatDateTime(value: string | null | undefined) {
  if (!value) return "-";
  return new Intl.DateTimeFormat("pt-BR", {
    dateStyle: "short",
    timeStyle: "short",
  }).format(new Date(value));
}

function formatPhone(value: string | null | undefined) {
  const digits = String(value || "").replace(/\D/g, "");
  if (!digits) return "";
  if (digits.length === 11) return digits.replace(/(\d{2})(\d{5})(\d{4})/, "($1) $2-$3");
  if (digits.length === 10) return digits.replace(/(\d{2})(\d{4})(\d{4})/, "($1) $2-$3");
  return String(value || "").trim();
}

function getPaymentMethodLabel(method?: string | null) {
  switch (String(method || "").trim()) {
    case "pix":
      return "Pix";
    case "credit_card":
      return "Cartão de crédito";
    case "debit_card":
      return "Cartão de débito";
    case "ticket":
      return "Boleto";
    case "cash":
      return "Dinheiro";
    case "transfer":
      return "Transferência bancária";
    default:
      return "A definir";
  }
}

function getStatusLabel(status?: string | null) {
  switch (String(status || "").trim()) {
    case "approved":
      return "Pagamento confirmado";
    case "partially_paid":
      return "Pagamento parcial";
    case "pending":
      return "Pagamento pendente";
    case "unpaid":
      return "Pagamento em aberto";
    case "rejected":
      return "Pagamento não aprovado";
    case "cancelled":
      return "Pagamento cancelado";
    case "refunded":
      return "Pagamento estornado";
    default:
      return "Pagamento registrado";
  }
}

export default async function ClientOrderReceiptPage(props: {
  params: Promise<{ slug: string; orderId: string }>;
  searchParams: Promise<{ print?: string }>;
}) {
  const params = await props.params;
  const searchParams = await props.searchParams;
  const slug = params.slug;
  const orderId = params.orderId;
  const autoPrint = String(searchParams?.print || "").trim() === "1";
  const cookieStore = await cookies();
  const token = cookieStore.get("ks_client_portal")?.value || "";

  if (!token || !slug || !orderId) {
    redirect(`/${slug}/cliente/login`);
  }

  const orderDetails = await getClientPortalOrderDetails({ slug, token, orderId });
  if (!orderDetails?.order) {
    redirect(`/${slug}/cliente?section=orders`);
  }

  const url = process.env.NEXT_PUBLIC_SUPABASE_URL;
  const anon = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY;
  let storeName = orderDetails.status_payload?.profile?.catalog_name || orderDetails.status_payload?.profile?.store_name || "Loja";
  let storeLegalName = orderDetails.status_payload?.profile?.store_name || orderDetails.status_payload?.profile?.catalog_name || "Loja";
  let storeDocument = "";
  let storeEmail = "";
  let storePhone = String(
    orderDetails.status_payload?.profile?.company_phone ||
      orderDetails.status_payload?.profile?.company_whatsapp ||
      orderDetails.status_payload?.profile?.phone ||
      ""
  ).trim();
  let storeWhatsapp = String(
    orderDetails.status_payload?.profile?.company_whatsapp ||
      orderDetails.status_payload?.profile?.phone ||
      orderDetails.status_payload?.profile?.company_phone ||
      ""
  ).trim();
  let storeAddress = "";

  if (url && anon) {
    try {
      const supabase = createSupabaseClient(url, anon);
      const { data: profile } = await supabase
        .from("profiles")
        .select("catalog_name,store_name,cnpj,company_email,address,company_phone,phone,company_whatsapp,whatsapp")
        .eq("slug", slug)
        .maybeSingle();
      storeName = profile?.catalog_name || profile?.store_name || storeName;
      storeLegalName = profile?.store_name || profile?.catalog_name || storeLegalName;
      storeDocument = String((profile as { cnpj?: string | null } | null)?.cnpj || "").trim();
      storeEmail = String((profile as { company_email?: string | null } | null)?.company_email || "").trim();
      storePhone = String(
        (profile as { company_phone?: string | null; phone?: string | null } | null)?.company_phone ||
          (profile as { company_phone?: string | null; phone?: string | null } | null)?.phone ||
          storePhone
      ).trim();
      storeWhatsapp = String(
        (profile as { company_whatsapp?: string | null; whatsapp?: string | null } | null)?.company_whatsapp ||
          (profile as { company_whatsapp?: string | null; whatsapp?: string | null } | null)?.whatsapp ||
          storeWhatsapp
      ).trim();
      storeAddress = String((profile as { address?: string | null } | null)?.address || "").trim();
    } catch {
    }
  }

  const order = orderDetails.order;
  const receipt = orderDetails.payment_receipt;
  const items = Array.isArray(orderDetails.items) ? orderDetails.items : [];
  const paymentMethodLabel = receipt?.method_label || getPaymentMethodLabel(receipt?.method);
  const paymentStatusLabel = getStatusLabel(receipt?.status);
  const paidAmount = Number(order.paid_amount || receipt?.amount || 0);
  const totalAmount = Number(order.total_amount || 0);
  const remainingAmount = Math.max(0, totalAmount - paidAmount);
  const paymentIsSettled = receipt?.status === "approved" || receipt?.status === "partially_paid";
  const pageTitle = paymentIsSettled ? "Comprovante de pagamento" : "Status do pagamento";
  const liquidationLabel = paymentIsSettled ? "Liquidação" : "Saldo pendente";
  const liquidationAmount = paymentIsSettled ? paidAmount : remainingAmount || totalAmount;
  const liquidationDescription = paymentIsSettled
    ? `${paymentMethodLabel} confirmado em ${formatDateTime(receipt?.paid_at || order.created_at)}`
    : "Pagamento ainda não liquidado no financeiro do pedido.";
  const paymentReference = String(receipt?.reference || "").trim();
  const payerName = String(receipt?.payer_name || "").trim();
  const payerEmail = String(receipt?.payer_email || "").trim();
  const payerDocument = String(receipt?.payer_document || "").trim();
  const receiptIssuedAt = receipt?.paid_at || order.created_at;
  const receiptZigzagPoints = "0,100 5,0 10,100 15,0 20,100 25,0 30,100 35,0 40,100 45,0 50,100 55,0 60,100 65,0 70,100 75,0 80,100 85,0 90,100 95,0 100,100";
  const receiptNumber = paymentReference || `PED-${order.number}`;
  const payerLabel = payerName || orderDetails.status_payload?.client?.name || "Não informado";
  const storePhoneFormatted = formatPhone(storePhone);
  const storeWhatsappFormatted = formatPhone(storeWhatsapp);
  const hasStoreDetails = Boolean(
    storeLegalName || storeName || storeDocument || storeEmail || storePhoneFormatted || storeWhatsappFormatted || storeAddress
  );

  return (
    <main className="min-h-screen bg-zinc-50 px-4 py-6 text-zinc-950 print:bg-white print:px-0 print:py-0">
      <ReceiptAutoPrintClient enabled={autoPrint} />

      <div className="mx-auto w-full max-w-4xl print:max-w-none">
        <div className="mb-4 flex items-center justify-between gap-3 print:hidden">
          <Link
            href={`/${slug}/cliente/pedido/${order.id}`}
            className="inline-flex h-10 items-center rounded-lg border border-zinc-200 bg-white px-4 text-sm font-medium text-zinc-700"
          >
            Voltar ao pedido
          </Link>
          <div className="flex items-center gap-2">
            <Link
              href={`/${slug}/cliente/pedido/${order.id}/comprovante?print=1`}
              className="inline-flex h-10 items-center rounded-lg border border-zinc-200 bg-white px-4 text-sm font-medium text-zinc-700"
            >
              Salvar em PDF
            </Link>
            <Link
              href={`/${slug}/cliente/pedido/${order.id}/comprovante?print=1`}
              className="inline-flex h-10 items-center rounded-lg bg-zinc-950 px-4 text-sm font-medium text-white"
            >
              Imprimir
            </Link>
          </div>
        </div>

        <section className="overflow-hidden rounded-xl border border-zinc-200 bg-white print:rounded-none print:border-0">
          <div className="border-b border-zinc-200 px-5 py-5 sm:px-7 sm:py-6 print:px-0">
            <div className="flex flex-col gap-5 sm:flex-row sm:items-start sm:justify-between">
              <div>
                <div className="text-[11px] font-semibold uppercase tracking-[0.22em] text-zinc-400">{pageTitle}</div>
                <h1 className="mt-2 text-[28px] font-semibold tracking-[-0.04em] text-zinc-950">Pedido #{order.number}</h1>
                <div className="mt-1 text-sm text-zinc-500">{storeName}</div>
              </div>

              <div className="grid gap-4 text-left sm:min-w-[260px] sm:grid-cols-2 sm:text-right">
                <div>
                  <div className="text-[11px] font-semibold uppercase tracking-[0.16em] text-zinc-400">Documento</div>
                  <div className="mt-1 text-sm font-semibold text-zinc-950">{receiptNumber}</div>
                </div>
                <div>
                  <div className="text-[11px] font-semibold uppercase tracking-[0.16em] text-zinc-400">Emitido em</div>
                  <div className="mt-1 text-sm font-semibold text-zinc-950">{formatDateTime(receiptIssuedAt)}</div>
                </div>
              </div>
            </div>
          </div>

          <div className="bg-[#f8f7f4] px-5 pb-8 pt-5 sm:px-7 sm:pt-7 print:px-0">
            <div className="grid gap-6 lg:grid-cols-[minmax(0,1fr)_280px]">
              <div className="space-y-5">
                <div className="border-b border-stone-300 pb-5">
                  <div className="grid gap-4 sm:grid-cols-2">
                    <div>
                      <div className="text-[11px] font-semibold uppercase tracking-[0.16em] text-slate-400">Loja</div>
                      <div className="mt-1.5 text-[15px] font-semibold text-slate-950">{storeName}</div>
                    </div>
                    <div>
                      <div className="text-[11px] font-semibold uppercase tracking-[0.16em] text-slate-400">Situação</div>
                      <div className="mt-1.5 text-[15px] font-semibold text-slate-950">{paymentStatusLabel}</div>
                    </div>
                    <div>
                      <div className="text-[11px] font-semibold uppercase tracking-[0.16em] text-slate-400">Meio</div>
                      <div className="mt-1.5 text-[15px] font-semibold text-slate-950">{paymentMethodLabel}</div>
                    </div>
                    <div>
                      <div className="text-[11px] font-semibold uppercase tracking-[0.16em] text-slate-400">
                        {paymentIsSettled ? "Valor liquidado" : "Valor pendente"}
                      </div>
                      <div className="mt-1.5 text-[15px] font-semibold text-slate-950">
                        {formatMoney(paymentIsSettled ? paidAmount : liquidationAmount)}
                      </div>
                    </div>
                  </div>
                </div>

                {hasStoreDetails ? (
                  <div className="border-b border-stone-300 pb-5">
                    <div className="text-[11px] font-semibold uppercase tracking-[0.16em] text-slate-400">Emitente</div>
                    <div className="mt-4 grid gap-4 sm:grid-cols-2">
                      <div>
                        <div className="text-[11px] uppercase tracking-[0.12em] text-slate-400">Loja</div>
                        <div className="mt-1.5 break-words text-sm font-semibold text-slate-950">{storeName}</div>
                      </div>
                      <div>
                        <div className="text-[11px] uppercase tracking-[0.12em] text-slate-400">Razão social</div>
                        <div className="mt-1.5 break-words text-sm font-semibold text-slate-950">{storeLegalName}</div>
                      </div>
                      {storeDocument ? (
                        <div>
                          <div className="text-[11px] uppercase tracking-[0.12em] text-slate-400">CNPJ</div>
                          <div className="mt-1.5 break-words text-sm font-semibold text-slate-950">{storeDocument}</div>
                        </div>
                      ) : null}
                      {storeEmail ? (
                        <div>
                          <div className="text-[11px] uppercase tracking-[0.12em] text-slate-400">E-mail</div>
                          <div className="mt-1.5 break-all text-sm font-semibold text-slate-950">{storeEmail}</div>
                        </div>
                      ) : null}
                      {storePhoneFormatted ? (
                        <div>
                          <div className="text-[11px] uppercase tracking-[0.12em] text-slate-400">Telefone</div>
                          <div className="mt-1.5 break-words text-sm font-semibold text-slate-950">{storePhoneFormatted}</div>
                        </div>
                      ) : null}
                      {storeWhatsappFormatted ? (
                        <div>
                          <div className="text-[11px] uppercase tracking-[0.12em] text-slate-400">WhatsApp</div>
                          <div className="mt-1.5 break-words text-sm font-semibold text-slate-950">{storeWhatsappFormatted}</div>
                        </div>
                      ) : null}
                    </div>
                    {storeAddress ? (
                      <div className="mt-4">
                        <div className="text-[11px] uppercase tracking-[0.12em] text-slate-400">Endereço</div>
                        <div className="mt-1.5 break-words text-sm font-semibold text-slate-950">{storeAddress}</div>
                      </div>
                    ) : null}
                  </div>
                ) : null}

                <div className="border-b border-stone-300 pb-5">
                  <div className="text-[11px] font-semibold uppercase tracking-[0.16em] text-slate-400">Itens do pedido</div>
                  <div className="mt-4 space-y-3">
                    {items.length > 0 ? (
                      items.map((item) => (
                        <div key={item.id} className="flex items-start justify-between gap-4 text-sm">
                          <div className="min-w-0">
                            <div className="font-semibold text-slate-950">{item.product_name || item.title || "Item"}</div>
                            <div className="mt-1 text-[12px] text-slate-500">
                              {item.quantity} x {formatMoney(item.unit_price)}
                            </div>
                          </div>
                          <div className="shrink-0 whitespace-nowrap font-semibold text-slate-950">{formatMoney(item.total_price)}</div>
                        </div>
                      ))
                    ) : (
                      <div className="text-sm text-slate-500">Nenhum item encontrado.</div>
                    )}
                  </div>
                </div>

                <div className="border-b border-stone-300 pb-5">
                  <div className="text-[11px] font-semibold uppercase tracking-[0.16em] text-slate-400">Pagador</div>
                  <div className="mt-4 grid gap-4 sm:grid-cols-3">
                    <div>
                      <div className="text-[11px] uppercase tracking-[0.12em] text-slate-400">Nome</div>
                      <div className="mt-1.5 break-words text-sm font-semibold text-slate-950">{payerLabel}</div>
                    </div>
                    <div>
                      <div className="text-[11px] uppercase tracking-[0.12em] text-slate-400">E-mail</div>
                      <div className="mt-1.5 break-all text-sm font-semibold text-slate-950">{payerEmail || "-"}</div>
                    </div>
                    <div>
                      <div className="text-[11px] uppercase tracking-[0.12em] text-slate-400">Documento</div>
                      <div className="mt-1.5 break-words text-sm font-semibold text-slate-950">{payerDocument || "-"}</div>
                    </div>
                  </div>
                </div>

                <div className="text-[11px] leading-5 text-slate-400">
                  Documento emitido em {formatDateTime(new Date().toISOString())} para acompanhamento e conferência do pagamento vinculado ao pedido.
                </div>
              </div>

              <aside className="relative overflow-hidden bg-white/55 px-5 pb-8 pt-5">
                <div className="text-[11px] font-semibold uppercase tracking-[0.16em] text-slate-400">Fechamento</div>
                <div className="mt-5 space-y-3 text-sm">
                  <div className="flex items-center justify-between gap-4 text-slate-700">
                    <span>Pedido</span>
                    <span className="font-semibold text-slate-950">#{order.number}</span>
                  </div>
                  <div className="flex items-center justify-between gap-4 text-slate-700">
                    <span>Referência</span>
                    <span className="break-all text-right font-semibold text-slate-950">{receiptNumber}</span>
                  </div>
                  <div className="flex items-center justify-between gap-4 text-slate-700">
                    <span>Total</span>
                    <span className="font-semibold text-slate-950">{formatMoney(totalAmount)}</span>
                  </div>
                  <div className="flex items-center justify-between gap-4 text-slate-700">
                    <span>Pago</span>
                    <span className="font-semibold text-slate-950">{formatMoney(paidAmount)}</span>
                  </div>
                </div>

                <div className="mt-5 border-t border-stone-300 pt-5">
                  <div className="flex items-center justify-between gap-4 text-[1.05rem] font-semibold text-slate-950">
                    <span>{liquidationLabel}</span>
                    <span>{formatMoney(liquidationAmount)}</span>
                  </div>
                  <div className="mt-2 text-[12px] text-slate-500">
                    {liquidationDescription}
                  </div>
                </div>

                <div className="absolute inset-x-0 bottom-0 h-4 overflow-hidden">
                  <svg viewBox="0 0 100 100" preserveAspectRatio="none" className="h-full w-full">
                    <polygon points={receiptZigzagPoints} fill="#ffffff" />
                  </svg>
                </div>
              </aside>
            </div>
          </div>
        </section>
      </div>
    </main>
  );
}
