import type { Metadata } from "next";
import { getSupabaseClient } from "@/lib/supabase";
import { notFound } from "next/navigation";
import Image from "next/image";
import { AlertCircle, Ban, Check, FileCode2, FileText, MessageCircle, ThumbsUp } from "lucide-react";
import { OrderStatusRefreshButton } from "@/components/OrderStatusRefreshButton";
import { notasPublicasDoPedido, type NotaPublica } from "@/lib/nota-fiscal-da-loja";
import { createAdminClient } from "@/lib/supabase-admin";

export const revalidate = 0;
export const dynamic = "force-dynamic";
export const dynamicParams = true;
const DISPLAY_TIMEZONE = "America/Sao_Paulo";

interface PublicQuoteProfile {
  id: string;
  store_name: string | null;
  catalog_name: string | null;
  logo_url: string | null;
  catalog_logo_url: string | null;
  quote_signature_required?: boolean | null;
  quote_art_registration_enabled?: boolean | null;
  quote_art_approval_required?: boolean | null;
  cnpj?: string | null;
  phone: string | null;
  company_phone: string | null;
  company_whatsapp?: string | null;
  company_email: string | null;
  address: string | null;
  slug?: string | null;
  status_page_bg_color?: string | null;
  status_page_box_bg_color?: string | null;
  status_page_icon_color?: string | null;
  status_page_text_color?: string | null;
  status_page_button_color?: string | null;
}

interface PublicQuoteClient {
  id: string;
  name: string;
  company_name: string | null;
  document?: string | null;
  email: string | null;
  phone: string | null;
  whatsapp: string | null;
  address_city?: string | null;
  address_state?: string | null;
}

interface PublicQuoteRow {
  id: string;
  number: number;
  created_at?: string;
  updated_at?: string;
  status?: string;
  title: string | null;
  currency?: string;
  subtotal?: number;
  discount?: number;
  shipping?: number;
  total?: number;
  expires_at: string | null;
  delivery_date?: string | null;
  notes: string | null;
}

interface PublicOrderRow {
  id: string;
  number: number;
  created_at: string;
  updated_at?: string; // Note: RPC get_public_quote might not return updated_at for order, we handle this
  status: string;
  total_amount: number;
  paid_amount?: number | null;
  financial_status?: string | null;
  approval_signature?: string | null;
  approval_signed_at?: string | null;
  approval_signed_name?: string | null;
  production_stage_id?: string | null;
  production_stage_label?: string | null;
  delivery_date?: string | null;
}

interface PublicQuotePayload {
  profile: PublicQuoteProfile;
  quote: PublicQuoteRow;
  client: PublicQuoteClient;
  order: PublicOrderRow | null;
  items: unknown[];
  order_items: unknown[];
}

async function fetchOrderStatus(token: string): Promise<PublicQuotePayload | null> {
  const supabase = getSupabaseClient();
  const orderStatusResult = await supabase.rpc("get_public_order_status", { p_token: token });
  if (!orderStatusResult.error && orderStatusResult.data) {
    return orderStatusResult.data as unknown as PublicQuotePayload;
  }

  const legacyResult = await supabase.rpc("get_public_quote", { p_token: token });
  if (legacyResult.error || !legacyResult.data) return null;
  return legacyResult.data as unknown as PublicQuotePayload;
}

function formatDateBr(value: string | null | undefined) {
  if (!value) return "";
  const normalized = String(value).split("T")[0];
  const parts = normalized.split("-");
  if (parts.length === 3 && parts[0].length === 4) {
    const [y, m, d] = parts;
    return `${d}/${m}/${y}`;
  }
  const dt = new Date(value);
  if (!Number.isFinite(dt.getTime())) return "";
  return dt.toLocaleDateString("pt-BR", { timeZone: DISPLAY_TIMEZONE });
}

function formatDateTimeBr(value: string | null | undefined) {
  if (!value) return "";
  const dt = new Date(value);
  if (!Number.isFinite(dt.getTime())) return "";
  return dt.toLocaleString("pt-BR", { dateStyle: "short", timeStyle: "short", timeZone: DISPLAY_TIMEZONE });
}

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

function getOrderStatusBadge(status: string | null | undefined) {
  switch (status) {
    case "pending_production":
      return {
        label: "Aguardando produção",
        className: "border-amber-200 bg-amber-50 text-amber-800",
        panelClassName: "border-amber-200 bg-amber-50 text-amber-900",
      };
    case "in_production":
      return {
        label: "Em produção",
        className: "border-sky-200 bg-sky-50 text-sky-800",
        panelClassName: "border-sky-200 bg-sky-50 text-sky-900",
      };
    case "finished":
      return {
        label: "Finalizado",
        className: "border-violet-200 bg-violet-50 text-violet-800",
        panelClassName: "border-violet-200 bg-violet-50 text-violet-900",
      };
    case "delivered":
      return {
        label: "Entregue",
        className: "border-emerald-200 bg-emerald-50 text-emerald-800",
        panelClassName: "border-emerald-200 bg-emerald-50 text-emerald-900",
      };
    case "canceled":
      return {
        label: "Cancelado",
        className: "border-rose-200 bg-rose-50 text-rose-800",
        panelClassName: "border-rose-200 bg-rose-50 text-rose-900",
      };
    default:
      return {
        label: "Pedido em andamento",
        className: "border-zinc-200 bg-zinc-50 text-zinc-700",
        panelClassName: "border-zinc-200 bg-zinc-50 text-zinc-900",
      };
  }
}

// Calcula contraste inteligente para garantir que o texto fique legível sobre qualquer fundo
function getContrastTextColor(hexColor: string) {
  if (!hexColor) return "#ffffff";
  const hex = hexColor.replace("#", "");
  const r = parseInt(hex.substring(0, 2), 16) || 0;
  const g = parseInt(hex.substring(2, 4), 16) || 0;
  const b = parseInt(hex.substring(4, 6), 16) || 0;
  // Formula YIQ para luminância
  const yiq = (r * 299 + g * 587 + b * 114) / 1000;
  return yiq >= 128 ? "#09090b" : "#ffffff";
}

export async function generateMetadata(props: { params: Promise<{ slug: string; token: string }> }): Promise<Metadata> {
  const params = await props.params;
  const data = await fetchOrderStatus(params.token);
  const storeName = data?.profile.catalog_name || data?.profile.store_name || "Loja";
  const orderNumber = data?.order?.number ? `#${data.order.number}` : "";
  const title = `Acompanhar Pedido ${orderNumber} | ${storeName}`;
  const description = "Veja o status atualizado do seu pedido em tempo real.";

  return {
    title: { absolute: title },
    description,
    openGraph: {
      title,
      description,
    },
  };
}

export default async function OrderStatusPage(props: { params: Promise<{ slug: string; token: string }> }) {
  const params = await props.params;
  const { token } = params;

  const data = await fetchOrderStatus(token);
  if (!data) return notFound();

  const { order, profile, client, quote } = data;
  if (!order) return notFound();

  /* Notas fiscais autorizadas do pedido, para o cliente baixar daqui mesmo. */
  let notasFiscais: NotaPublica[] = [];
  try {
    notasFiscais = await notasPublicasDoPedido(createAdminClient(), order.id);
  } catch {
    notasFiscais = [];
  }
  
  const logoUrl = profile.logo_url || profile.catalog_logo_url;

  const orderStatusSteps = [
    {
      key: "pending_production",
      title: "Aguardando produção",
      description: "Seu pedido foi confirmado e entrou na fila de produção.",
    },
    {
      key: "in_production",
      title: "Em produção",
      description: "Nossa equipe está produzindo os itens do seu pedido.",
    },
    {
      key: "finished",
      title: "Finalizado",
      description: "A produção foi concluída e está pronta para entrega/retirada.",
    },
    {
      key: "delivered",
      title: "Entregue",
      description: "Pedido entregue com sucesso.",
    },
  ];

  const currentOrderStepIndex = orderStatusSteps.findIndex((step) => step.key === (order.status || ""));
  const isOrderCanceled = order.status === "canceled";
  const isOrderDelivered = order.status === "delivered";
  const isOrderFinished = order.status === "finished";
  const totalAmount = Number(order.total_amount) || 0;
  const paidAmount = Number(order.paid_amount) || 0;
  const remainingAmount = Math.max(0, totalAmount - paidAmount);
  const paymentProgress = totalAmount > 0 ? Math.min(100, Math.max(0, (paidAmount / totalAmount) * 100)) : 0;
  const shouldShowPaymentReminder = isOrderFinished && remainingAmount > 0.009;
  const whatsappDigits = (profile.company_whatsapp || profile.phone || "").replace(/\D/g, "");
  const paymentReminderMessage = `Olá! Sobre o pedido #${order.number}, vi que falta ${formatMoney(
    quote?.currency,
    remainingAmount
  )} para pagamento. Pode me orientar para quitar antes da retirada?`;
  const paymentReminderWhatsappUrl = whatsappDigits
    ? `https://wa.me/${whatsappDigits}?text=${encodeURIComponent(paymentReminderMessage)}`
    : null;
  const deliveredDate = formatDateBr(order.updated_at || order.created_at);
  const lastUpdatedAt = formatDateTimeBr(order.updated_at || order.created_at);
  const statusBadge = getOrderStatusBadge(order.status);
  const timelineProgress =
    isOrderCanceled || currentOrderStepIndex < 0
      ? 0
      : ((Math.min(currentOrderStepIndex, orderStatusSteps.length - 1) + 1) / orderStatusSteps.length) * 100;

  const customStyles = {
    "--status-bg": profile.status_page_bg_color || "#f5f7fb",
    "--status-box": profile.status_page_box_bg_color || "#ffffff",
    "--status-icon": profile.status_page_icon_color || "#4b2ae6",
    "--status-text": profile.status_page_text_color || "#09090b",
    "--status-button": profile.status_page_button_color || "#4b2ae6",
    "--status-button-text": getContrastTextColor(profile.status_page_button_color || "#4b2ae6"),
    "--status-text-muted": "color-mix(in srgb, var(--status-text) 60%, transparent)",
    "--status-border": "color-mix(in srgb, var(--status-text) 10%, transparent)",
    "--status-overlay": "color-mix(in srgb, var(--status-text) 4%, transparent)",
  } as React.CSSProperties;

  return (
    <div style={customStyles} className="min-h-[100dvh] bg-[var(--status-bg)] flex flex-col items-center py-6 px-4 sm:py-10">
      <div className="w-full max-w-2xl bg-[var(--status-box)] rounded-2xl shadow-[0_2px_12px_-4px_rgba(0,0,0,0.06)] border border-[var(--status-border)] overflow-hidden">
        
        {/* Header Compacto */}
        <div className="p-5 sm:p-6 border-b border-[var(--status-border)]">
          
          {logoUrl ? (
            <div className="flex justify-center mb-6">
              <Image 
                src={logoUrl} 
                alt="Logo" 
                width={80} 
                height={80} 
                className="h-16 sm:h-20 w-auto object-contain" 
                unoptimized 
              />
            </div>
          ) : null}

          <div className="flex flex-col sm:flex-row sm:items-center justify-between gap-4">
            <div className="flex flex-col items-center sm:items-start text-center sm:text-left gap-1 min-w-0">
              <h1 className="text-lg sm:text-xl font-semibold text-[var(--status-text)] truncate w-full">
                {profile.catalog_name || profile.store_name}
              </h1>
              <div className="text-xs sm:text-sm text-[var(--status-text-muted)] flex items-center justify-center sm:justify-start gap-1.5 flex-wrap">
                <span className="font-medium text-[var(--status-text)]">Pedido #{order.number}</span>
                <span>&bull;</span>
                <span className="truncate max-w-[200px]">{client.name}</span>
              </div>
            </div>
            
            <div className="flex items-center justify-center sm:justify-end gap-2">
              <span className={`px-3 py-1.5 text-[11px] font-bold uppercase tracking-wider rounded-md border border-[var(--status-icon)] bg-[color-mix(in_srgb,var(--status-icon)_10%,transparent)] text-[var(--status-icon)]`}>
                {statusBadge.label}
              </span>
              <OrderStatusRefreshButton />
            </div>
          </div>

          {/* Resumo em Strip */}
          <div className="mt-5 flex flex-row rounded-xl border border-[var(--status-border)] bg-[var(--status-overlay)] divide-x divide-[var(--status-border)] text-xs overflow-x-auto custom-scrollbar">
            <div className="flex-1 min-w-[100px] p-3 sm:px-4">
              <div className="text-[9px] sm:text-[10px] font-semibold uppercase tracking-wider text-[var(--status-text-muted)] mb-0.5 truncate">Status Atual</div>
              <div className="font-medium text-[var(--status-text)] text-[11px] sm:text-xs truncate">{order.production_stage_label || statusBadge.label}</div>
            </div>
            <div className="flex-1 min-w-[100px] p-3 sm:px-4">
              <div className="text-[9px] sm:text-[10px] font-semibold uppercase tracking-wider text-[var(--status-text-muted)] mb-0.5 truncate">{isOrderDelivered ? "Data da entrega" : "Previsão"}</div>
              <div className="font-medium text-[var(--status-text)] text-[11px] sm:text-xs truncate">{isOrderDelivered && deliveredDate ? deliveredDate : quote?.delivery_date ? formatDateBr(quote.delivery_date) : "A definir"}</div>
            </div>
            <div className="flex-1 min-w-[100px] p-3 sm:px-4">
              <div className="text-[9px] sm:text-[10px] font-semibold uppercase tracking-wider text-[var(--status-text-muted)] mb-0.5 truncate">Atualização</div>
              <div className="font-medium text-[var(--status-text)] text-[11px] sm:text-xs truncate">{lastUpdatedAt || "-"}</div>
            </div>
          </div>
        </div>

        {/* Timeline Stepper Horizontal (Desktop) / Vertical (Mobile) */}
        <div className="p-5 sm:p-6 border-b border-[var(--status-border)]">
          <div className="text-sm font-semibold text-[var(--status-text)] mb-6">Andamento do pedido</div>
          
          <div className="relative">
            {/* Linha horizontal Desktop */}
            <div className="hidden sm:block absolute top-[15px] left-0 w-full h-1 bg-[var(--status-overlay)] rounded-full" />
            {!isOrderCanceled && (
              <div className="hidden sm:block absolute top-[15px] left-0 h-1 bg-[var(--status-icon)] rounded-full transition-all" style={{ width: `${timelineProgress}%` }} />
            )}

            <div className="flex flex-col sm:flex-row justify-between gap-6 sm:gap-2">
              {orderStatusSteps.map((step, index) => {
                const isDone = !isOrderCanceled && currentOrderStepIndex >= index;
                const isCurrent = !isOrderCanceled && currentOrderStepIndex === index;
                const markerClass = isCurrent
                  ? "border-[var(--status-icon)] bg-[var(--status-icon)] text-[var(--status-box)] shadow-sm"
                  : isDone
                    ? "border-[var(--status-text)] bg-[var(--status-text)] text-[var(--status-box)]"
                    : "border-[var(--status-border)] bg-[var(--status-box)] text-[var(--status-text-muted)]";
                
                return (
                  <div key={step.key} className="relative flex items-start sm:flex-col sm:items-center sm:flex-1 gap-3 sm:gap-2 group">
                    {/* Linha vertical Mobile */}
                    {index < orderStatusSteps.length - 1 && (
                      <div className={`sm:hidden absolute left-[15px] top-8 bottom-[-24px] w-0.5 ${isDone && currentOrderStepIndex > index ? 'bg-[var(--status-icon)]' : 'bg-[var(--status-overlay)]'}`} />
                    )}
                    
                    <div className={`relative z-10 flex h-8 w-8 shrink-0 items-center justify-center rounded-full border-2 text-xs font-bold transition-colors ${markerClass}`}>
                      {isDone ? <Check size={14} strokeWidth={3} /> : index + 1}
                    </div>
                    
                    <div className="sm:text-center pt-1.5 sm:pt-0">
                      <div className={`text-xs font-bold ${isCurrent ? "text-[var(--status-icon)]" : isDone ? "text-[var(--status-text)]" : "text-[var(--status-text-muted)]"}`}>
                        {step.title}
                      </div>
                      {isCurrent && (
                        <div className="text-[11px] text-[var(--status-text-muted)] mt-0.5 leading-snug max-w-[200px] sm:mx-auto">
                          {step.description}
                        </div>
                      )}
                    </div>
                  </div>
                );
              })}
            </div>
          </div>
        </div>

        {notasFiscais.length > 0 && (
          <div className="p-5 sm:p-6 border-b border-[var(--status-border)]">
            <div className="text-sm font-semibold text-[var(--status-text)] mb-3">
              {notasFiscais.length === 1 ? "Nota fiscal" : "Notas fiscais"}
            </div>
            <div className="flex flex-col divide-y divide-[var(--status-border)]">
              {notasFiscais.map((nota) => {
                const sigla = nota.modelo === "nfce" ? "NFC-e" : nota.modelo === "nfse" ? "NFS-e" : "NF-e";
                const cancelada = nota.status === "cancelada";
                return (
                  <div key={nota.id} className="flex flex-wrap items-center gap-3 py-3 first:pt-0 last:pb-0">
                    <div className="flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-[color-mix(in_srgb,var(--status-icon)_12%,transparent)] text-[var(--status-icon)]">
                      <FileText size={16} />
                    </div>
                    <div className="min-w-0 flex-1">
                      <div className="text-sm font-semibold text-[var(--status-text)]">
                        {sigla}
                        {nota.numero ? ` nº ${nota.numero}` : ""}
                        {cancelada ? " · cancelada" : ""}
                        {nota.teste ? " · teste, sem valor fiscal" : ""}
                      </div>
                      <div className="text-[11px] text-[var(--status-text-muted)]">
                        {formatMoney(quote?.currency, nota.valor)}
                        {nota.autorizadaEm ? ` · ${formatDateBr(nota.autorizadaEm)}` : ""}
                      </div>
                    </div>
                    {!cancelada && nota.temPdf ? (
                      <a
                        href={`/api/pedido-status/${token}/nota-fiscal/${nota.id}?tipo=pdf`}
                        target="_blank"
                        rel="noreferrer"
                        className="inline-flex items-center gap-1.5 rounded-lg bg-[var(--status-button)] px-3 py-2 text-xs font-bold text-[var(--status-button-text)] transition hover:opacity-90"
                      >
                        <FileText size={14} /> Baixar PDF
                      </a>
                    ) : null}
                    {nota.temXml ? (
                      <a
                        href={`/api/pedido-status/${token}/nota-fiscal/${nota.id}?tipo=xml`}
                        className="inline-flex items-center gap-1.5 rounded-lg border border-[var(--status-border)] px-3 py-2 text-xs font-bold text-[var(--status-text)] transition hover:bg-[var(--status-overlay)]"
                      >
                        <FileCode2 size={14} /> XML
                      </a>
                    ) : null}
                  </div>
                );
              })}
            </div>
          </div>
        )}

        {/* Alertas: Pagamento / Entregue / Cancelado */}
        <div className="p-5 sm:p-6 bg-[var(--status-overlay)] flex flex-col gap-4">
          {shouldShowPaymentReminder && (
            <div className="relative overflow-hidden rounded-2xl bg-[var(--status-box)] border border-[var(--status-border)] p-6 sm:p-8 shadow-[0_8px_30px_-12px_color-mix(in_srgb,var(--status-text)_15%,transparent)]">
              {/* Efeitos de luz sutis para dar "vida" baseados nas cores */}
              <div className="pointer-events-none absolute -right-20 -top-20 h-64 w-64 rounded-full bg-[var(--status-icon)] opacity-10 blur-3xl" />
              <div className="pointer-events-none absolute -bottom-20 -left-20 h-64 w-64 rounded-full bg-[var(--status-text)] opacity-5 blur-3xl" />
              
              <div className="relative z-10 flex flex-col gap-6 sm:gap-7">
                <div className="flex items-start gap-4">
                  <div className="flex h-12 w-12 shrink-0 items-center justify-center rounded-full bg-[var(--status-overlay)] text-[var(--status-icon)] shadow-sm border border-[var(--status-border)]">
                    <AlertCircle size={24} strokeWidth={2.5} />
                  </div>
                  <div className="flex-1 min-w-0 pt-1">
                    <div className="text-xl sm:text-2xl font-bold text-[var(--status-text)] tracking-tight">
                      Falta {formatMoney(quote?.currency, remainingAmount)}
                    </div>
                    <p className="text-sm text-[var(--status-text-muted)] mt-1 leading-relaxed max-w-lg">
                      Seu pedido já está pronto! Regularize o valor pendente no atendimento ou fale conosco pelo WhatsApp para liberar a retirada.
                    </p>
                  </div>
                </div>

                <div className="grid grid-cols-2 gap-3 sm:gap-4">
                  <div className="rounded-xl bg-[var(--status-overlay)] border border-[var(--status-border)] p-4 sm:p-5">
                    <div className="text-[11px] font-bold uppercase tracking-wider text-[var(--status-text-muted)] mb-1.5">Valor Total</div>
                    <div className="font-semibold text-[var(--status-text)] text-lg sm:text-xl tracking-tight">{formatMoney(quote?.currency, totalAmount)}</div>
                  </div>
                  <div className="rounded-xl bg-[var(--status-overlay)] border border-[var(--status-border)] p-4 sm:p-5">
                    <div className="text-[11px] font-bold uppercase tracking-wider text-[var(--status-icon)] mb-1.5">Valor Pago</div>
                    <div className="font-semibold text-[var(--status-icon)] text-lg sm:text-xl tracking-tight">{formatMoney(quote?.currency, paidAmount)}</div>
                  </div>
                </div>

                <div className="flex items-center gap-4">
                  <div className="h-2.5 flex-1 bg-[var(--status-overlay)] rounded-full overflow-hidden border border-[var(--status-border)]">
                    <div 
                      className="h-full bg-[var(--status-icon)] rounded-full relative" 
                      style={{ width: `${paymentProgress}%` }}
                    />
                  </div>
                  <div className="text-xs font-bold text-[var(--status-icon)] whitespace-nowrap">{paymentProgress.toFixed(0)}% pago</div>
                </div>

                {paymentReminderWhatsappUrl && (
                  <div className="pt-2">
                    <a
                      href={paymentReminderWhatsappUrl}
                      target="_blank"
                      rel="noreferrer"
                      className="flex items-center justify-center w-full gap-2 text-xs sm:text-sm font-bold bg-[var(--status-button)] text-[var(--status-button-text)] px-4 py-3 sm:px-6 sm:py-4 rounded-xl hover:opacity-90 transition-all active:scale-[0.98] shadow-md whitespace-nowrap"
                    >
                      <MessageCircle size={18} className="shrink-0" /> 
                      <span className="truncate">Falar sobre o pagamento</span>
                    </a>
                  </div>
                )}
              </div>
            </div>
          )}

          {isOrderDelivered && (
            <div className="rounded-xl border border-[var(--status-border)] bg-[var(--status-overlay)] p-4 flex items-center gap-3 text-[var(--status-text)]">
              <ThumbsUp size={16} className="shrink-0 text-[var(--status-icon)]" />
              <div className="text-sm font-medium">Obrigado pela confiança! Pedido finalizado e entregue.</div>
            </div>
          )}

          {isOrderCanceled && (
            <div className="rounded-xl border border-[var(--status-border)] bg-[var(--status-overlay)] p-4 flex items-center gap-3 text-[var(--status-text)]">
              <Ban size={16} className="shrink-0 text-rose-600" />
              <div className="text-sm font-medium">Este pedido foi cancelado. Fale com a loja para mais detalhes.</div>
            </div>
          )}

          {(profile.company_whatsapp || profile.phone) && !isOrderDelivered && !isOrderCanceled && !shouldShowPaymentReminder && (
            <div className="flex justify-center">
              <a
                href={`https://wa.me/${(profile.company_whatsapp || profile.phone)?.replace(/\D/g, "")}`}
                target="_blank"
                rel="noreferrer"
                className="inline-flex items-center gap-1.5 text-xs font-semibold text-[var(--status-text-muted)] hover:text-[var(--status-text)] transition-colors"
              >
                <MessageCircle size={14} /> Dúvidas? Fale no WhatsApp
              </a>
            </div>
          )}
        </div>

      </div>
    </div>
  );
}
