import { sdk } from "@/lib/auth";

export type CustomerOrderItem = {
  id: string;
  title: string;
  quantity: number;
  variant_title?: string | null;
  thumbnail?: string | null;
  unit_price?: number;
};

export type CustomerOrder = {
  id: string;
  display_id: number | string;
  status: string;
  fulfillment_status: "por_alistar" | "alistado" | "despachado" | "cancelado" | string;
  created_at: string;
  total: number;
  currency_code: string;
  email?: string | null;
  shipping_guide?: string | null;
  shipping_carrier?: string | null;
  shipping_tracking_url?: string | null;
  shipped_at?: string | null;
  items: CustomerOrderItem[];
};

const ORDER_FIELDS = [
  "id",
  "display_id",
  "status",
  "email",
  "created_at",
  "currency_code",
  "metadata",
  "total",
  "summary.*",
  "items.*",
  "items.variant.*",
  "items.thumbnail",
  "items.detail.*",
].join(",");

function money(order: Record<string, unknown>): number {
  const summary = order.summary as Record<string, unknown> | undefined;
  if (typeof order.total === "number") return order.total;
  if (typeof summary?.current_order_total === "number") {
    return summary.current_order_total as number;
  }
  if (typeof summary?.original_order_total === "number") {
    return summary.original_order_total as number;
  }
  return 0;
}

export function trackingUrlFor(
  carrier: string | null | undefined,
  guide: string | null | undefined,
  explicit?: string | null
): string | null {
  if (explicit?.trim()) return explicit.trim();
  if (!guide?.trim()) return null;
  const g = encodeURIComponent(guide.trim());
  const c = (carrier || "").toLowerCase();
  if (c.includes("servientrega")) {
    return `https://www.servientrega.com/wps/portal/Colombia/rastreo-envio?guia=${g}`;
  }
  if (c.includes("coordinadora")) {
    return `https://www.coordinadora.com/portafolio-de-servicios/servicios-en-linea/rastrear-guias/?guia=${g}`;
  }
  if (c.includes("interrapidisimo") || c.includes("inter rapidisimo")) {
    return `https://www.interrapidisimo.com/sigue-tu-envio/?guia=${g}`;
  }
  if (c.includes("envia")) {
    return `https://envia.co/rastreo?guia=${g}`;
  }
  if (c.includes("tcc")) {
    return `https://www.tcc.com.co/courier/rastrear-envio/?guia=${g}`;
  }
  // genérico: Google search del número
  return `https://www.google.com/search?q=${g}+guia+envio`;
}

function mapOrder(raw: Record<string, unknown>): CustomerOrder {
  const meta = (raw.metadata || {}) as Record<string, unknown>;
  const medusaStatus = String(raw.status || "");
  const isCanceled = medusaStatus === "canceled";
  const fulfillment = isCanceled
    ? "cancelado"
    : String(meta.fulfillment_status || "por_alistar");
  const guide = meta.shipping_guide ? String(meta.shipping_guide) : null;
  const carrier = meta.shipping_carrier
    ? String(meta.shipping_carrier)
    : null;
  const trackingExplicit = meta.shipping_tracking_url
    ? String(meta.shipping_tracking_url)
    : null;

  const itemsRaw = (raw.items || []) as Record<string, unknown>[];
  const items: CustomerOrderItem[] = itemsRaw.map((it) => ({
    id: String(it.id || ""),
    title: String(it.title || "Prenda"),
    quantity: Number(it.quantity || 1),
    variant_title: (it.variant_title as string) || null,
    thumbnail: (it.thumbnail as string) || null,
    unit_price: typeof it.unit_price === "number" ? it.unit_price : undefined,
  }));

  return {
    id: String(raw.id),
    display_id: (raw.display_id as number | string) ?? String(raw.id).slice(-6),
    status: medusaStatus,
    fulfillment_status: fulfillment,
    created_at: String(raw.created_at || ""),
    total: money(raw),
    currency_code: String(raw.currency_code || "cop"),
    email: (raw.email as string) || null,
    shipping_guide: guide,
    shipping_carrier: carrier,
    shipping_tracking_url: trackingUrlFor(carrier, guide, trackingExplicit),
    shipped_at: meta.shipped_at ? String(meta.shipped_at) : null,
    items,
  };
}

export async function fetchMyOrders(): Promise<CustomerOrder[]> {
  const { orders } = await sdk.store.order.list({
    limit: 50,
    fields: ORDER_FIELDS,
  });
  return ((orders || []) as Record<string, unknown>[]).map(mapOrder);
}
