import { mapDocumentFieldsToList } from "@/utils/mapDocuments";
import type { BookingDocumentFieldKey } from "@/redux/api/activityApi";

export type BookingPersonDocsInput = {
  name?: string;
  aadharFront?: string;
  aadharBack?: string;
  panCard?: string;
  passportPhoto?: string;
  additionalDocs?: string[];
};

type BookingOrHoldDocument = BookingPersonDocsInput & {
  persons?: BookingPersonDocsInput[];
};

/** Rows for DocumentsCard: KYC + additional (both support reupload when metadata is set). */
export type MergedCustomerDocumentRow = {
  id: string;
  name: string;
  url?: string | null;
  status: string;
  uploadDate?: string;
  generatedAt?: string | null;
  isBooking?: boolean;
  content?: string;
  paperSize?: unknown;
  personIndex?: number;
  bookingFieldKey?: BookingDocumentFieldKey;
  additionalDocIndex?: number;
};

/** One co-applicant / person: KYC + additional rows for the left “Booking Documents” card. */
export function buildKycRowsForBookingPerson(
  person: BookingPersonDocsInput,
  personIndex: number
): MergedCustomerDocumentRow[] {
  const label = person?.name ? ` (${person.name})` : "";

  const kyc = mapDocumentFieldsToList({
    aadharFront: person.aadharFront,
    aadharBack: person.aadharBack,
    panCard: person.panCard,
    passportPhoto: person.passportPhoto,
  }).map((d) => ({
    ...d,
    id: `kyc-${personIndex}-${d.id}`,
    name: `${d.name}${label}`,
    isBooking: true,
    personIndex,
    bookingFieldKey: d.id as BookingDocumentFieldKey,
  }));

  const additional = (person.additionalDocs || [])
    .filter(Boolean)
    .map((url, i) => ({
      id: `additional-${personIndex}-${i}`,
      name: `Additional Document ${i + 1}${label}`,
      url,
      status: "Verified",
      uploadDate: new Date().toISOString(),
      isBooking: true,
      personIndex,
      bookingFieldKey: "additionalDocs" as const,
      additionalDocIndex: i,
    }));

  return [...kyc, ...additional];
}

/**
 * Flat list of all KYC + additional rows (used when a single merged list is needed).
 */
export function buildMergedDocumentRowsForGeneratedCard(
  unitBookingOrHold: BookingOrHoldDocument | Record<string, unknown>
): MergedCustomerDocumentRow[] {
  const doc = unitBookingOrHold as BookingOrHoldDocument;
  const persons = Array.isArray((doc as any)?.persons)
    ? ((doc as any).persons as BookingPersonDocsInput[])
    : [];

  const rows: MergedCustomerDocumentRow[] = [];

  if (persons.length > 0) {
    persons.forEach((person, idx) => {
      rows.push(...buildKycRowsForBookingPerson(person, idx));
    });
    return rows;
  }

  const flat = mapDocumentFieldsToList({
    aadharFront: doc.aadharFront,
    aadharBack: doc.aadharBack,
    panCard: doc.panCard,
    passportPhoto: doc.passportPhoto,
  }).map((d) => ({
    ...d,
    id: `kyc-flat-${d.id}`,
    isBooking: true,
  }));

  rows.push(...flat);

  (doc.additionalDocs || [])
    .filter(Boolean)
    .forEach((url, i) => {
      rows.push({
        id: `additional-flat-${i}`,
        name: `Additional Document ${i + 1}`,
        url,
        status: "Verified",
        uploadDate: new Date().toISOString(),
        isBooking: true,
        personIndex: 0,
        bookingFieldKey: "additionalDocs",
        additionalDocIndex: i,
      });
    });

  return rows;
}
