import type { Job, JobRow } from "@/lib/api/types/job.types";

function fmtDate(iso: string): string {
  if (!iso || iso.startsWith("1900")) return "—";
  try {
    return new Date(iso)
      .toLocaleDateString("en-GB", { day: "2-digit", month: "short", year: "numeric" })
      .replace(/ /g, "-");
  } catch { return "—"; }
}

// ─────────────────────────────────────────────────────────────────────────────
// mapJobToRow
// ─────────────────────────────────────────────────────────────────────────────
export function mapJobToRow(job: Job, index: number): JobRow {
  const auditor = job.leadAuditor;
  return {
    sno:          index + 1,
    id:           job.id,
    companyName:  job.company?.name    ?? "—",
    companyId:    job.company?.id      ?? 0,
    jobCodes:     job.jobCodes         ?? [],
    jobCodesStr:  (job.jobCodes ?? []).join(", ") || "—",
    stage:        job.stage,
    templateName: job.template?.name   ?? "—",
    leadAuditor:  auditor ? `${auditor.firstName} ${auditor.lastName}` : "—",
    date:         fmtDate(job.date),
    mdRisk:       job.mdRisk,
    scheduleSlot: job.scheduleSlot,
    standards:    job.standards        ?? [],
    numEmployees: job.numEmployees     ?? 0,
    md:           job.md               ?? "—",
    naceEacCodes: job.naceEacCodes     ?? "—",
    pdfUrl:       job.template?.url    ?? "",
    createdAt:    fmtDate(job.createdAt),
    updatedAt:    fmtDate(job.updatedAt),
    raw:          job,
  };
}

// ─────────────────────────────────────────────────────────────────────────────
// mapJobsApiResponse
// ─────────────────────────────────────────────────────────────────────────────
export function mapJobsApiResponse(jobs: Job[]): JobRow[] {
  return jobs.map((j, idx) => mapJobToRow(j, idx));
}

// ─────────────────────────────────────────────────────────────────────────────
// mapColumnKeyToValue
// ─────────────────────────────────────────────────────────────────────────────
export function mapColumnKeyToValue(key: string, row: JobRow): any {
  const map: Record<string, any> = {
    id:           `#${row.id}`,
    companyName:  row.companyName,
    jobCodesStr:  row.jobCodesStr,
    stage:        row.stage,
    templateName: row.templateName,
    leadAuditor:  row.leadAuditor,
    date:         row.date,
    mdRisk:       row.mdRisk,
    scheduleSlot: row.scheduleSlot,
    numEmployees: row.numEmployees,
    md:           row.md,
    naceEacCodes: row.naceEacCodes,
    standards:    row.standards,
    createdAt:    row.createdAt,
    updatedAt:    row.updatedAt,
  };
  return map[key] ?? row[key] ?? "—";
}

// ─────────────────────────────────────────────────────────────────────────────
// formatJobForExport
// ─────────────────────────────────────────────────────────────────────────────
export function formatJobForExport(row: JobRow): Record<string, string | number> {
  return {
    "No.":          row.sno,
    "Job ID":       row.id,
    "Company":      row.companyName,
    "Job Codes":    row.jobCodesStr,
    "Stage":        row.stage,
    "Template":     row.templateName,
    "Lead Auditor": row.leadAuditor,
    "Date":         row.date,
    "MD Risk":      row.mdRisk,
    "Schedule":     row.scheduleSlot,
    "Employees":    row.numEmployees,
    "Standards":    row.standards?.map((s) => s.name).join(" | ") ?? "",
    "Created":      row.createdAt,
  };
}
