import type { Inquiry, InquiryRow } from "@/lib/api/types/inquiry.types";

// ─── Status display config ──────────────────────────────────────────────────
export const STATUS_CONFIG: Record<
  string,
  { label: string; bg: string; color: string; dot: string }
> = {
  PENDING: {
    label: "Pending",
    bg: "#fef3c7",
    color: "#92400e",
    dot: "#f59e0b",
  },
  IN_REVIEW: {
    label: "In Review",
    bg: "#dbeafe",
    color: "#1e40af",
    dot: "#3b82f6",
  },
  DRAFT_READY: {
    label: "Draft Ready",
    bg: "#ede9fe",
    color: "#5b21b6",
    dot: "#7c3aed",
  },
  CHANGES_REQUESTED: {
    label: "Changes Requested",
    bg: "#fee2e2",
    color: "#991b1b",
    dot: "#ef4444",
  },
  CLIENT_CONFIRMED: {
    label: "Client Confirmed",
    bg: "#d1fae5",
    color: "#065f46",
    dot: "#10b981",
  },
  FINAL_ISSUED: {
    label: "Final Issued",
    bg: "#dcfce7",
    color: "#14532d",
    dot: "#22c55e",
  },
};

// ─── Inquiry type display ───────────────────────────────────────────────────
export const TYPE_CONFIG: Record<
  string,
  { label: string; bg: string; color: string }
> = {
  SURVEILLANCE: { label: "Surveillance", bg: "#dbeafe", color: "#1e40af" },
  RE_CERTIFICATION: {
    label: "Re-Certification",
    bg: "#d1fae5",
    color: "#065f46",
  },
  INITIAL: { label: "Initial", bg: "#fef3c7", color: "#92400e" },
};

// ─── Format date for display ────────────────────────────────────────────────
export function formatDisplayDate(dateStr: string | null | undefined): string {
  if (!dateStr) return "—";
  const d = new Date(dateStr);
  if (isNaN(d.getTime())) return dateStr;
  return d
    .toLocaleDateString("en-GB", {
      day: "2-digit",
      month: "short",
      year: "numeric",
    })
    .replace(/ /g, " ");
}

// ─── mapInquiryToRow ────────────────────────────────────────────────────────
export function mapInquiryToRow(inquiry: Inquiry, index: number): InquiryRow {
  return {
    sno: index + 1,
    id: inquiry.id,
    inquiry_ref: inquiry.inquiry_ref ?? "—",
    inquiry_type: inquiry.inquiry_type,
    company_name: inquiry.company?.name ?? "—",
    company_id: inquiry.company?.id ?? 0,
    company: inquiry.company,
    audit_date: inquiry.audit_date ?? "—",
    auditor_name: inquiry.auditor_name ?? "—",
    previous_cert_no: inquiry.previous_cert_no ?? "—",
    certificate_number: inquiry.certificate_number ?? "—",
    issue_date: inquiry.issue_date ?? "—",
    expiry_date: inquiry.expiry_date ?? "—",
    surveillance_audit_due: (inquiry as any).surveillance_audit_due ?? null,
    recertification_due: (inquiry as any).recertification_due ?? null,
    scope_of_work: inquiry.scope_of_work ?? "—",
    accreditation_body: inquiry.accreditation_body ?? "—",
    status: inquiry.status,
    standards: inquiry.standards ?? [],
    submitted_by: inquiry.submitted_by ?? null,
    assigned_to: inquiry.assigned_to ?? null,
    draft_pdf_path: inquiry.draft_pdf_path ?? null,
    draft_docx_path: inquiry.draft_docx_path ?? null,
    draft_generated_at: (inquiry as any).draft_generated_at ?? null,
    change_request_notes: inquiry.change_request_notes ?? null,
    notes: inquiry.notes ?? null,
    cert_body: (inquiry as any).cert_body ?? null, // ✅ NEW
    audit_stage: (inquiry as any).audit_stage ?? null,
    // ✅ NEW — pass documents through to the row so DynamicInquiryRow can show them
    documents: (inquiry as any).documents ?? [],
    created_at: inquiry.created_at,
    updated_at: inquiry.updated_at,
  } as InquiryRow;
}

// ─── mapInquiriesApiResponse ─────────────────────────────────────────────────
export function mapInquiriesApiResponse(inquiries: Inquiry[]): InquiryRow[] {
  return inquiries.map((inq, idx) => mapInquiryToRow(inq, idx));
}

// ─── mapColumnKeyToValue ─────────────────────────────────────────────────────
export function mapColumnKeyToValue(key: string, row: InquiryRow): any {
  const map: Record<string, any> = {
    inquiry_ref: row.inquiry_ref,
    inquiry_type: row.inquiry_type,
     cert_body: (row as any).cert_body || "—",        // ✅ NEW
  audit_stage: (row as any).audit_stage || "—",    // ✅ NEW
    company_name: row.company_name,
    company_id: row.company_name, // display name in Company column
    auditor_name: row.auditor_name,
    audit_date: formatDisplayDate(row.audit_date),
    certificate_number: row.certificate_number,
    issue_date: formatDisplayDate(row.issue_date),
    expiry_date: formatDisplayDate(row.expiry_date),
    surveillance_audit_due: formatDisplayDate(row.surveillance_audit_due),
    recertification_due: formatDisplayDate(row.recertification_due),
    previous_cert_no: row.previous_cert_no,
    accreditation_body: row.accreditation_body,
    scope_of_work: row.scope_of_work,
    notes: row.notes,
    status: row.status,
    submitted_by: row.submitted_by
      ? `${row.submitted_by.firstName ?? ""} ${row.submitted_by.lastName ?? ""}`.trim() ||
        "—"
      : "—",
    assigned_to: row.assigned_to
      ? `${row.assigned_to.firstName ?? ""} ${row.assigned_to.lastName ?? ""}`.trim() ||
        "—"
      : "—",
    // ✅ standards always returns a STRING — never the array
    standards: row.standards?.map((s) => s.name).join(", ") || "—",
    standards_count: `${row.standards?.length ?? 0} standard(s)`,
    standards_names: row.standards?.map((s) => s.name).join(", ") || "—",
    created_at: formatDisplayDate(row.created_at),
    updated_at: formatDisplayDate(row.updated_at),
  };

  // ✅ Get value with fallback
  let value = map[key];
  if (value === undefined) {
    value = (row as any)[key];
  }

  // ✅ SAFETY GUARD: never return objects/arrays — always coerce to string
  if (value === null || value === undefined) return "—";
  if (typeof value === "object") {
    // It's an object/array — try to extract a useful field
    if (Array.isArray(value)) {
      return value.length === 0 ? "—" : `${value.length} item(s)`;
    }
    // Object — try common name fields
    return value.name ?? value.title ?? value.label ?? value.id ?? "—";
  }
  return value;
}
