export type DaactCode = "PPR" | "RE" | "RESP" | "RGA";
export type ProjectType = "Maison neuve" | "Extension" | "Autre";

export type CreateDossierInput = {
  reference: string;
  firstName: string;
  lastName: string;
  email: string;
  city: string;
  projectType: ProjectType;
  projectDetail: string;
  createdSurface: number;
  daactCode: DaactCode;
  quoteNumber?: string;
  quoteStatus?: "Envoyé" | "Accepté";
  depositInvoiceNumber?: string;
  depositInvoiceStatus?: "Envoyée" | "Payée";
  balanceInvoiceNumber?: string;
  balanceInvoiceStatus?: "Envoyée" | "Payée";
  reminderObject?: "Pièces manquantes" | "Acompte non payé" | "Dossier complet — solde attendu";
  reminderDate?: string;
};

export type CreatedDossier = {
  reference: string;
  mondayItemId: string;
  mondayItemUrl: string;
  driveFolderId: string;
  driveFolderUrl: string;
  portalToken: string;
  portalUrl: string;
};

export const DRIVE_ROOT_NAME = "DAACT PARTAGE";
export const DRIVE_CONTAINER_NAMES = {
  inProgress: "Dossiers en Cours",
  completedToFile: "Dossiers Terminés à Classer",
} as const;

export const DOSSIER_SUBFOLDERS = [
  "00_DEPOTS_ORIGINAUX",
  "01_ADMINISTRATIF",
  "02_PLANS",
  "03_ETUDES_TECHNIQUES",
  "04_ATTESTATIONS ET DECHARGES",
  "05_PHOTOS_CHANTIER",
  "06_FACTURES",
  "99_A_VERIFIER",
] as const;

export const MONDAY_GROUP_KEYS = {
  inProgress: "topics",
  completed: "group_title",
  cancelled: "group_mm5c890b",
} as const;

export const MONDAY_COLUMNS = [
  { id: "ref_dossier", label: "Référence", type: "text", required: true },
  { id: "type_daact", label: "Type de DAACT", type: "status", required: true },
  { id: "statut_dossier", label: "Statut du dossier", type: "status", required: true },
  { id: "type_projet", label: "Type de projet", type: "status", required: true },
  { id: "precision_projet", label: "Précision projet", type: "long_text", required: false },
  { id: "surface_creee", label: "Surface créée", type: "numbers", required: true },
  { id: "email_client", label: "E-mail client", type: "email", required: true },
  { id: "lien_portail", label: "Lien portail client", type: "link", required: true },
  { id: "dossier_drive", label: "Dossier Google Drive", type: "link", required: true },
  { id: "completude", label: "Complétude", type: "numbers", required: true },
  { id: "pieces_recues", label: "Pièces reçues", type: "numbers", required: true },
  { id: "pieces_attendues", label: "Pièces attendues", type: "numbers", required: true },
  { id: "numero_devis", label: "N° devis", type: "text", required: false },
  { id: "statut_devis", label: "Statut devis", type: "status", required: false },
  { id: "numero_acompte", label: "N° facture acompte", type: "text", required: false },
  { id: "statut_acompte", label: "Statut acompte", type: "status", required: false },
  { id: "numero_solde", label: "N° facture solde", type: "text", required: false },
  { id: "statut_solde", label: "Statut solde", type: "status", required: false },
  { id: "objet_relance", label: "Objet de la relance", type: "dropdown", required: false },
  { id: "date_relance", label: "Date de relance", type: "date", required: false },
  { id: "dernier_depot", label: "Dernier dépôt", type: "date", required: false },
  { id: "alerte_interne", label: "Alerte interne", type: "long_text", required: false },
] as const;

function normalize(value: string) {
  return value
    .normalize("NFD")
    .replace(/[\u0300-\u036f]/g, "")
    .replace(/[^a-zA-Z0-9]+/g, "_")
    .replace(/^_|_$/g, "")
    .toUpperCase();
}

export function buildDriveFolderName(input: Pick<CreateDossierInput, "reference" | "lastName" | "firstName" | "city" | "daactCode">) {
  return [input.reference, input.lastName, input.firstName, input.city, input.daactCode].map(normalize).join("_");
}

export function buildMondayItemName(input: Pick<CreateDossierInput, "reference" | "lastName" | "firstName" | "city" | "daactCode">) {
  return `${input.reference} · ${input.lastName.toUpperCase()} ${input.firstName} · ${input.city} · ${input.daactCode}`;
}
