const express = require("express");
const router = express.Router();
const fs = require("fs");
const PizZip = require("pizzip");
const Docxtemplater = require("docxtemplater");
const logger = require("../utils/logger");
const path = require("path");
const moment = require("moment");
const parcoursService = require("../services/parcoursService");
const contratService = require("../services/contratService");
const userService = require("../services/userService");
const globalService = require("../services/globalService");
//const projetformrc = require("../../public/js/projet-form-rc");
//const moduloRC = require("../constantes/json-modulateur-rc"); useless pour le moment ?

require("moment/locale/fr");
moment.locale("fr");

// Fonctions helper pour récupérer les valeurs selon la franchise choisie
function getSelectedTarifReference(tarifRC) {
  const franchise = tarifRC.franchiseChoisie;
  if (franchise === '250') return tarifRC.primeTotal_250;
  if (franchise === '400') return tarifRC.primeTotal_400;
  if (franchise === 'mini300') return tarifRC.primeTotal_2000;
  return null;
}

function getSelectedPrime(tarifRC, type) {
  const franchise = tarifRC.franchiseChoisie;
  if (!franchise) return 0;
  
  const suffix = franchise === 'mini300' ? '2000' : franchise;
  const fieldName = `prime${type}_${suffix}`;
  return tarifRC[fieldName] || 0;
}

function getSelectedTaux(tarifRC, type) {
  const franchise = tarifRC.franchiseChoisie;
  if (!franchise) return 0;
  
  const suffix = franchise === 'mini300' ? '2000' : franchise;
  const fieldName = `taux${type}_${suffix}`;
  return tarifRC[fieldName] || 0;
}

router.post("/rc/projet/:numParcours", async (req, res) => {
  try {
    const content = fs.readFileSync(
      path.resolve("src/templates/template-projet-rc.docx"),
      "binary"
    );

    const zip = new PizZip(content);
    const doc = new Docxtemplater(zip, { paragraphLoop: true, linebreaks: true });
    const numParcours = req.params.numParcours.toUpperCase();

    const parcours = await parcoursService.getParcoursByNumParcours(numParcours);
    const contrat = await contratService.getContratById(parcours.contrat);
    const client = contrat?.["@expand"]?.client || {};
    const intermediaire = contrat?.["@expand"]?.intermediaire || {};
    
    // Récupérer la collection rc avec ses relations (APRÈS placerDansEnCours, c'est dans enCours)
    const rcFull = contrat?.["@expand"]?.enCours;
    if (!rcFull) {
      logger.log('error', 'No RC found for contrat:', contrat.id);
      return res.status(404).send("Aucune donnée RC trouvée pour ce contrat");
    }
    
    // Les données sont déjà expandées par contratService
    const rc = rcFull?.["@expand"]?.projetRC || {};

    const listAssAdd = [];

    // Traiter les assurés additionnels s'ils existent
    if (rc.assureAdditionnel && Array.isArray(rc.assureAdditionnel)) {
      rc.assureAdditionnel.forEach((objet) => {
        listAssAdd.push(
          objet.nom +
          " - Adresse : " +
          objet.adresse +
          " - Siret : " +
          objet.siret
        );
      });
    }

    // Conditions zone
    let hasMondeEntier = false;
    let hasZone1 = false;
    let hasZone2 = false;
    let hasZone3 = false;
    let hasZone4 = false;
    let hasZone5 = false;
    let hasZone6 = false;
    let hasActiviteButNotMultimodal = false; // Attention trick pour les zones géographiques dans le cas de multimodal
    let hasZone456 = false;

    // Cas monde entier
    if (
      rc.zone1 &&
      rc.zone2 &&
      rc.zone3 &&
      rc.zone4 &&
      rc.zone5 &&
      rc.zone6 &&
      (rc.actVoiturier ||
        rc.actLoueur ||
        rc.actDouane ||
        rc.actDemPar ||
        rc.actDemParDom ||
        rc.actDemParAdv ||
        rc.actDemEntr ||
        rc.actDemInterne ||
        rc.actGardeMeuble ||
        rc.actEntDep ||
        rc.actPrestaLog ||
        rc.actLevageur)
    ) {
      hasMondeEntier = true;
    }

    // Cas date du jour d'édition
    let dateNow = moment().format("DD MMMM YYYY");

    // Cas une ou plusieurs zone(s) spécifique(s) + cas zone456
    if (hasMondeEntier == false && (rc.actVoiturier || rc.actLoueur || rc.actDouane || rc.actDemPar || rc.actDemParDom || rc.actDemParAct || rc.actDemEntr || rc.actDemInterne || rc.actGardeMeuble || rc.actEntDep || rc.actPrestaLog || rc.actLevageur ||  rc.actDemParAdv)) {
      if (rc.zone1) {
        hasZone1 = true;
      }
      if (rc.zone2) {
        hasZone2 = true;
      }
      if (rc.zone3) {
        hasZone3 = true;
      }
      if (rc.zone4) {
        hasZone4 = true;
        hasZone456 = true;
      }
      if (rc.zone5) {
        hasZone5 = true;
        hasZone456 = true;
      }
      if (rc.zone6) {
        hasZone6 = true;
        hasZone456 = true;
      }
    }

    // Cas Activité multimodal + Au minimum une zone
    if (rc.actMultimodal) {
      if (hasZone1 || hasZone2 || hasZone3 || hasZone456 || hasMondeEntier) {
        hasActiviteButNotMultimodal = true;
      }
    }

    let hasMondeEntierOrMultimodal, hasNotMondeEntierOrMultimodal;
    if (rc.actMultimodal || hasMondeEntier) {
      hasMondeEntierOrMultimodal = true;
      hasNotMondeEntierOrMultimodal = false;
    } else {
      hasMondeEntierOrMultimodal = false;
      hasNotMondeEntierOrMultimodal = true;
    }

    // Conditions Extensions RCC
    let extRCC = false;

    if ( rc.extRCCModifCalArrim == true || rc.extRCCFerroutage == true || rc.extRCCFraisRecons == true || rc.extRCCConfie == true || rc.extRCCTPPC == true || rc.extRCCRegie == true || rc.extRCCSansMontageDemontage == true ) {
      extRCC = true;
    }

    // Conditions Extensions RCE
    let extRCE = false;

    if (rc.extRCEMontageDemontage == true || rc.extRCEBraDebra == true) {
      extRCE = true;
    }

    // Conditions Activitées
    let hasActiviteDemenageurGardeMeuble = false;
    if ( rc.actDemPar == true || rc.actDemEntr == true || rc.actDemParDom == true || rc.actDemParAdv == true || rc.actDemInterne) {
      hasActiviteDemenageurGardeMeuble = true;
    }

    let oneOfActiviteDemenageurParticulier = false;
    if ( rc.actDemPar == true || rc.actDemParDom == true || rc.actDemParAdv == true ) {
      oneOfActiviteDemenageurParticulier = true;
    }

    let coorDem = "";
    if ( (rc.actDemPar == true || rc.actDemParDom == true || rc.actDemParAdv == true) && (rc.actDemEntr == true || rc.actDemInterne == true) && rc.actGardeMeuble == true) {
      coorDem = ",";
    } else if ( (rc.actDemPar == true || rc.actDemParDom == true || rc.actDemParAdv == true) && (rc.actDemEntr == true || rc.actDemInterne == true) && rc.actGardeMeuble == false ) {
      coorDem = " et";
    }

    // Variables numériques
    const franchiseTarif = "250";

    doc.render({
      // Client
      nomClient: client.nom,
      adrClient: client.adresse,
      postalClient: client.codePostal,
      villeClient: client.ville,
      numClient: client.numClient,

      // Intermédiaire
      nomInter: intermediaire.nom,
      adrInter: intermediaire.adresse,
      postalInter: intermediaire.codePostal,
      villeInter: intermediaire.ville,
      oriasInter: intermediaire.numOrias,
      hasOrias: intermediaire.numOrias == "" ? false : true,
      numInter: intermediaire.numTelephone,
      mailInter: intermediaire.mail,
      hasMail: intermediaire.mail ? true : false,

      // Contrat
      numSaisine: contrat.numSaisine,
      numContrat: contrat.numContrat,
      numProjet: contrat.numSaisine ? contrat.numSaisine : contrat.numContrat,
      hasCP: contrat.type == "AN" || contrat.type == "TEMPORAIRE" ? true : false,
      hasRemplacement: contrat.type == "REMPLACEMENT" ? true : false,
      hasPJ: rc.pj,
      hasParticipationResultat: rc.participationResultat,
      hasRCE: rc.autresRC,
      hasExtRCC: extRCC,
      hasExtRCE: extRCE,
      hasAssAdd: listAssAdd.length > 0 ? true : false,
      listAssAdd: listAssAdd,
      listDesiVehicule: rc.designationVehicule,
      hasForfaitaire: rc.typeCot == "forfaitaire" ? true : false,
      hasRevisable: rc.typeCot == "revisable" ? true : false,
      hasCourtier: intermediaire.type == "COURTIER" ? true : false,
      hasAgent: intermediaire.type == "COURTIER" ? false : true,
      hasAgentMutualiste: intermediaire.type == "AGENT MUTUALISTE" ? true : false,

      // Temporalité contrat
      dateJour: dateNow,
      typeFractionnement: rc.tempo,
      hasTypeTemporaire: contrat.type == "TEMPORAIRE" ? true : false,
      hasTypeAutreTempo: contrat.type == "AN" || contrat.type == "REMPLACEMENT" ? true : false,
      dateDebutEffet: rc.dateEffet == "00/00/0000" ? "A PRECISER" : rc.dateEffet,
      dateFinEffet: rc.dateFin == "00/00/0000" ? "A PRECISER" : rc.dateFin,
      dateEcheance: rc.dateEcheance == "00/00" ? "A PRECISER" : rc.dateEcheance,

      // Activite
      hasActiviteVoiturier: rc.actVoiturier,
      garActiviteVoiturier: globalService.customFormatNumber(rc.valueActVoiturier, false),
      hasActiviteLoueur: rc.actLoueur,
      garActiviteLoueur: globalService.customFormatNumber(rc.valueActLoueur, false),
      hasActiviteMultimodal: rc.actMultimodal,
      garActiviteMultimodal: globalService.customFormatNumber(rc.valueActMultimodal, false),
      hasActiviteDouane: rc.actDouane,
      garActiviteDouane: globalService.customFormatNumber(rc.valueActDouane, false),
      hasOneOfActiviteDemenageurParticulier: oneOfActiviteDemenageurParticulier,
      hasActiviteDemenageurParticulier: rc.actDemPar,
      garActiviteDemenageurParticulier: globalService.customFormatNumber(rc.valueActDemPar, false),
      hasActiviteDPEtendue: rc.actDemParDom,
      garActiviteDPEtendue: globalService.customFormatNumber(rc.valueActDemParDom, false),
      hasActiviteDemenageurParticulierAdvalorem: rc.actDemParAdv,
      garActiviteDemenageurParticulierAdvalorem: globalService.customFormatNumber(rc.valueActDemParAdv, false),
      hasActiviteDemenageurEntreprises: rc.actDemEntr,
      garActiviteDemenageurEntreprises: globalService.customFormatNumber(rc.valueActDemEntr, false),
      hasActiviteDemenageurInterne: rc.actDemInterne,
      garActiviteDemenageurInterne: globalService.customFormatNumber(rc.valueActDemInterne, false),
      hasActiviteGardeMeubles: rc.actGardeMeuble,
      garActiviteGardeMeubles: globalService.customFormatNumber(rc.valueActGardeMeuble, false),
      hasActiviteEntrepositaireDepositaire: rc.actEntDep,
      garActiviteEntrepositaireDepositaire: globalService.customFormatNumber(rc.valueActEntDep, false),
      hasActivitePrestataireLogistique: rc.actPrestaLog,
      garActivitePrestataireLogistique: globalService.customFormatNumber(rc.valueActPrestaLog, false),
      hasActiviteManutentionnaireLevageur: rc.actLevageur,
      garActiviteManutentionnaireLevageur: globalService.customFormatNumber(rc.valueActLevageur, false),
      hasActiviteTransitaire: rc.actTransitaire,
      garActiviteTransitaire: globalService.customFormatNumber(rc.valueActTransitaire, false),
      hasActiviteDemenageurGardeMeuble: hasActiviteDemenageurGardeMeuble,
      varCoorDem: coorDem,

      // Marchandises
      hasMarchandiseOrdinaire: rc.marOrdinaire,
      hasMarchandiseVehiculesRoulants: rc.marRoulant,
      hasMarchandiseEngins: rc.marEngins,
      hasMarchandiseVehiculesRoulantsDemenagement: rc.marRoulantDem,
      hasMarchandiseMobiliersUsages: rc.marMobilerUsag,
      hasMarchandisePerissables: rc.marPerissable,
      hasMarchandiseAnimauxVivants: rc.marAnimaux,
      hasMarchandiseCiterne: rc.marCiterne,
      hasMarchandiseBeton: rc.marBeton,
      hasMarchandiseExceptionnels: rc.marExceptionnels,
      hasMarchandiseVrac: rc.marVrac,

      // Zone
      hasMondeEntier: hasMondeEntier,
      hasZone1: hasZone1,
      hasZone2: hasZone2,
      hasZone3: hasZone3,
      hasZone4: hasZone4,
      hasZone5: hasZone5,
      hasZone6: hasZone6,
      hasActiviteButNotMultimodal: hasActiviteButNotMultimodal,
      hasMondeEntierOrMultimodal: hasMondeEntierOrMultimodal,
      hasNotMondeEntierOrMultimodal: hasNotMondeEntierOrMultimodal,
      hasZone456: hasZone456,

      // Extensions de garanties RCC
      hasExtModifCallageArrimage: rc.extRCCModifCalArrim,
      hasExtFerroutage: rc.extRCCFerroutage,
      hasExtReconstitution: rc.extRCCFraisRecons,
      hasExtConfies: rc.extRCCConfie,
      hasCCValeurDecla: rc.typeExtConfies == "VALEUR DECLAREE" || rc.typeExtConfies == "" ? true : false,
      hasCCAdValo: rc.typeExtConfies == "ADVALOREM" ? true : false,
      hasExtTPPC: rc.extRCCTPPC,
      hasExtRegie: rc.extRCCRegie,
      hasExtSansMontageDemontage: rc.extRCCSansMontageDemontage,

      // Extensions de garanties RCC
      hasExtBranchementDebranchement: rc.extRCEBraDebra,
      hasExtMontageDemontage: rc.extRCEMontageDemontage,

      // Advalo
      grMultimodal: rc.grilleMultimodal,
      grTerrestre: rc.grilleTerrestre,
      grAerien: rc.grilleAerien,

      // Variables numérique
      franchiseTarif: franchiseTarif,
      cotisationRCCHT: globalService.customFormatNumber(rc.cotRCCHT, true),
      tauxRCCHT: globalService.customFormatNumber(rc.tauxRCCHT, true, true),
      cotisationRCCTTC: globalService.customFormatNumber(rc.cotRCCTTC, true),
      tauxRCCTTC: globalService.customFormatNumber(rc.tauxRCCTTC, true, true),
      cotisationRCEHT: globalService.customFormatNumber(rc.cotRCEHT, true),
      tauxRCEHT: globalService.customFormatNumber(rc.tauxRCEHT, true, true),
      cotisationRCETTC: globalService.customFormatNumber(rc.cotRCETTC, true),
      tauxRCETTC: globalService.customFormatNumber(rc.tauxRCETTC, true, true),
      PJHT: globalService.customFormatNumber(rc.cotPJHT, true),
      PJTTC: globalService.customFormatNumber(rc.cotPJTTC, true),
      cotisationMini: globalService.customFormatNumber(rc.cotIrreductible, true),
      cotisationTotale: globalService.customFormatNumber(rc.cotTotalTTC, true),
      fraisRepFraction: globalService.customFormatNumber(rc.cotFraisTTC, true),
      ca: globalService.customFormatNumber(rc.ca, true),
    });

    const buf = doc.getZip().generate({ type: "nodebuffer" });

    const currentDate = new Date();

    // Formatage de la date au format "JJ-MM-AAAA-HH-MM-SS"
    const day = String(currentDate.getDate()).padStart(2, "0");
    const month = String(currentDate.getMonth() + 1).padStart(2, "0");
    const year = currentDate.getFullYear();
    const hours = String(currentDate.getHours()).padStart(2, "0");
    const minutes = String(currentDate.getMinutes()).padStart(2, "0");
    const seconds = String(currentDate.getSeconds()).padStart(2, "0");
    const formattedDate = `${day}-${month}-${year}-${hours}-${minutes}-${seconds}`;

    // Génération du nom de fichier
    const sanitizedClientNom = client.nom
      .replace(/[^\w\s.-]/gi, "")
      .replace(/\s+/g, "-");
    const filename = `Projet-${contrat.produit}-${parcours.numParcours}-${sanitizedClientNom}-${formattedDate}`;

    // Définit le type de contenu et un nom de fichier par défaut pour le téléchargement
    res.setHeader(
      "Content-Type",
      "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
    );

    res.setHeader(
      "Content-Disposition",
      "attachment; filename=" + filename + ".docx"
    );

    // Envoie le buffer au client, déclenchant le téléchargement
    res.send(buf);
  } catch (error) {
    logger.log('error', 'Error in RC projet generation:', error);
    return res.status(500).send("Erreur lors de la génération du projet RC");
  }
});

router.post("/rc/tarif/:numParcours", async (req, res) => {
  try {
    const content = fs.readFileSync(
      path.resolve("src/templates/template-declinaison-tarifaire-rc.docx"),
      "binary"
    );

    const zip = new PizZip(content);
    const doc = new Docxtemplater(zip, { paragraphLoop: true, linebreaks: true });

    const numParcours = req.params.numParcours.toUpperCase();
    const parcours = await parcoursService.getParcoursByNumParcours(numParcours);
    const contrat = await contratService.getContratById(parcours.contrat);
    const client = contrat?.["@expand"]?.client || {};
    const user = await userService.getUserById(parcours.dernierUtilisateur);
    
    // Récupérer la collection rc avec ses relations (APRÈS placerDansEnCours, c'est dans enCours)
    const rcFull = contrat?.["@expand"]?.enCours;
    if (!rcFull) {
      logger.log('error', 'No RC found for contrat:', contrat.id);
      return res.status(404).send("Aucune donnée RC trouvée pour ce contrat");
    }
    
    // Les données sont déjà expandées par contratService
    const rc = rcFull?.["@expand"]?.tarifRC || {};
    const rcMain = rcFull || {};

    // Formatage des taux avec maximum 2 décimales
    function formatTaux(taux) {
      if (!taux) return 0;
      return parseFloat(taux).toFixed(2);
    }

    // Préparer les données des activités avec leurs marchandises et activités complémentaires
    const activites = [];
    
    // Voiturier/Loueur
    if (rcMain.checkVoiturier || rcMain.checkLoueur) {
      activites.push({
        type: 'Voiturier/Loueur',
        capital: rcMain.capitalVoiturier || 0,
        pourcentage: rc.pourcentageVoiturier || 0,
        marchandises: rcMain.marchandisesVoiturier || [],
        activitesCompl: rcMain.activitesVoiturier || []
      });
    }

    // Commissionnaire de Transport
    if (rcMain.checkCommissionnaire) {
      activites.push({
        type: 'Commissionnaire de Transport',
        capital: rcMain.capitalCommissionnaire || 0,
        pourcentage: rc.pourcentageCommissionnaire || 0,
        marchandises: rcMain.marchandisesCommissionnaire || [],
        activitesCompl: rcMain.activitesCommissionnaire || []
      });
    }

    // Déménageur
    if (rcMain.checkDemenageur) {
      activites.push({
        type: 'Déménageur',
        capital: rcMain.capitalDemenageur || 0,
        pourcentage: rc.pourcentageDemenageur || 0,
        marchandises: rcMain.marchandisesDemenageur || [],
        activitesCompl: rcMain.activitesDemenageur || []
      });
    }

    // Logistique
    if (rcMain.checkLogistique) {
      activites.push({
        type: 'Logistique',
        capital: rcMain.capitalLogistique || 0,
        pourcentage: rc.pourcentageLogistique || 0,
        marchandises: rcMain.marchandisesLogistique || [],
        activitesCompl: rcMain.activitesLogistique || []
      });
    }

    // Autocariste
    if (rcMain.checkAutocariste) {
      activites.push({
        type: 'Autocariste',
        capital: rcMain.capitalAutocariste || 0,
        pourcentage: rc.pourcentageAutocariste || 0,
        marchandises: rcMain.marchandisesAutocariste || [],
        activitesCompl: rcMain.activitesAutocariste || []
      });
    }

    // Autres activités
    if (rcMain.checkAutres) {
      activites.push({
        type: 'Autres activités',
        capital: rcMain.capitalAutres || 0,
        pourcentage: rc.pourcentageAutres || 0,
        marchandises: rcMain.marchandisesAutres || [],
        activitesCompl: rcMain.activitesAutres || []
      });
    }

    // Préparer les zones
    const zones = [];
    if (rcMain.zone1) zones.push("Zone 1");
    if (rcMain.zone2) zones.push("Zone 2");
    if (rcMain.zone3) zones.push("Zone 3");
    if (rcMain.zone4) zones.push("Zone 4");
    if (rcMain.zone5) zones.push("Zone 5");
    if (rcMain.zone6) zones.push("Zone 6");

    // Préparer les garanties additionnelles
    const garantiesAdditionnelles = [];
    if (rc.checkStationLavage) garantiesAdditionnelles.push("Station de lavage");
    if (rc.checkGarageInterne) garantiesAdditionnelles.push("Garage interne");
    if (rc.checkCSE) garantiesAdditionnelles.push("CSE");
    if (rc.checkTPPC) garantiesAdditionnelles.push(`TPPC (Capital: ${rc.capitalTPPC || 0}€, Véhicules: ${rc.vehiculesTPPC || 0})`);
    if (rc.checkPJ) garantiesAdditionnelles.push("Protection Juridique");

    // Préparer les engagements complémentaires
    const engagements = [];
    if (rc.checkDomImmat) engagements.push(`Dommages immatériels (Capital: ${rc.capitalDomImmat || 0}€)`);
    if (rc.checkContConf) engagements.push(`Contenu confié (Capital: ${rc.capitalContConf || 0}€)`);
    if (rc.checkDiffInv) engagements.push(`Différence d'inventaire (Capital: ${rc.capitalDiffInv || 0}€)`);

    let dateNow = moment().format("DD MMMM YYYY");

    doc.render({
      // Infos générales
      matricule: user.matricule,
      date: dateNow,
      typeCotisation: rcMain.typeCotisation || "Non défini",
      hasforfaitaire: !(rcMain.typeCotisation === "forfaitaire" || (!rcMain.chiffreAffaires || rcMain.chiffreAffaires === 0)),
      hasRCE: rcMain.checkRCE || false,
      hasContrat: !!contrat.numContrat,
      numContrat: contrat.numContrat,
      hasSaisine: !!contrat.numSaisine,
      numSaisine: contrat.numSaisine,
      numeroCS: contrat.numSaisine || contrat.numContrat,
      nomAssure: client.nom,
      ca: rcMain.chiffreAffaires || 0,
      hasNbVehicule: (rcMain.nombreVehicules || 0) > 0,
      nbVehicule: rcMain.nombreVehicules || 0,

      // Activités principales
      hasVoiturierLoueur: rcMain.checkVoiturier || rcMain.checkLoueur,
      capitalAssureVoiturierLoueur: rcMain.capitalVoiturier || 0,
      pourcentageVoiturierLoueur: rc.pourcentageVoiturier || 0,
      marchandiseVoiturierLoueur: rcMain.marchandisesVoiturier || [],
      activiteVoiturierLoueur: rcMain.actComplVoiturier || [],

      hasComTransport: rcMain.checkCommissionnaire || false,
      capitalAssureComTransport: rcMain.capitalCommissionnaire || 0,
      pourcentageComTransport: rc.pourcentageCommissionnaire || 0,
      marchandiseComTransport: rcMain.marchandisesCommissionnaire || [],
      activiteComTransport: rcMain.actComplCommissionnaire || [],

      hasDemenageur: rcMain.checkDemenageur || false,
      capitalAssureDemenageur: rcMain.capitalDemenageur || 0,
      pourcentageDemenageur: rc.pourcentageDemenageur || 0,
      marchandiseDemenageur: rcMain.marchandisesDemenageur || [],
      activiteDemenageur: rcMain.actComplDemenageur || [],

      hasLogistique: rcMain.checkLogistique || false,
      capitalAssureLogistique: rcMain.capitalLogistique || 0,
      pourcentageLogistique: rc.pourcentageLogistique || 0,
      marchandiseLogistique: rcMain.marchandisesLogistique || [],
      activiteLogistique: rcMain.actComplLogistique || [],

      hasAutocariste: rcMain.checkAutocariste || false,
      capitalAssureAutocariste: rcMain.capitalAutocariste || 0,
      pourcentageAutocariste: rc.pourcentageAutocariste || 0,
      marchandiseAutocariste: rcMain.marchandisesAutocariste || [],
      activiteAutocariste: rcMain.activitesAutocariste || [],

      hasAutre: rcMain.checkAutres || false,
      capitalAssureAutre: rcMain.capitalAutres || 0,
      pourcentageAutre: rc.pourcentageAutres || 0,
      marchandiseAutre: rcMain.marchandisesAutres || [],
      //activiteAutre: rcMain.activitesAutres || [],  existe pas dans ejs

      // Zones géographiques
      zones: zones,

      // Garanties additionnelles
      hasGarantieAdd: garantiesAdditionnelles.length > 0,
      garantieAdd: garantiesAdditionnelles,

      // Engagements complémentaires
      hasEngagement: engagements.length > 0,
      engagement: engagements,

      // Tarifs sélectionnés
      franchise: rc.franchiseChoisie || rc.franchiseSelectionnee,
      tarifReference: getSelectedTarifReference(rc),
      tarifCommercial: rc.tarifcommercial,
      primeRCC: getSelectedPrime(rc, 'RCC'),
      tauxRCC: formatTaux(getSelectedTaux(rc, 'RCC')),
      hasRCE: rcMain.checkRCE,
      primeRCE: getSelectedPrime(rc, 'RCE'),
      tauxRCE: formatTaux(getSelectedTaux(rc, 'RCE')),
      hasPrimePJ: rc.checkPJ && getSelectedPrime(rc, 'PJ') > 0,
      primePJ: getSelectedPrime(rc, 'PJ'),
      tauxGlobal: formatTaux(getSelectedTaux(rc, 'Global')),


      // Propositions franchise 250
      tarifRefP1: rc.primeTotal_250 || 0,
      pRCCP1: rc.primeRCC_250 || 0,
      tRCCP1: formatTaux(rc.tauxRCC_250),
      pRCEP1: rc.primeRCE_250 || 0,
      tRCEP1: formatTaux(rc.tauxRCE_250),
      primePJP1: rc.primePJ_250 || 0,
      tauxGlobalP1: formatTaux(rc.tauxGlobal_250),
      
      // Propositions franchise 400
      tarifRefP2: rc.primeTotal_400 || 0,
      pRCCP2: rc.primeRCC_400 || 0,
      tRCCP2: formatTaux(rc.tauxRCC_400),
      pRCEP2: rc.primeRCE_400 || 0,
      tRCEP2: formatTaux(rc.tauxRCE_400),
      primePJP2: rc.primePJ_400 || 0,
      tauxGlobalP2: formatTaux(rc.tauxGlobal_400),
      
      // Propositions franchise 2000
      tarifRefP3: rc.primeTotal_2000 || 0,
      pRCCP3: rc.primeRCC_2000 || 0,
      tRCCP3: formatTaux(rc.tauxRCC_2000),
      pRCEP3: rc.primeRCE_2000 || 0,
      tRCEP3: formatTaux(rc.tauxRCE_2000),
      primePJP3: rc.primePJ_2000 || 0,
      tauxGlobalP3: formatTaux(rc.tauxGlobal_2000),
    });

    const buf = doc.getZip().generate({ type: "nodebuffer" });

    const currentDate = new Date();

    // Formatage de la date au format "JJ-MM-AAAA-HH-MM-SS"
    const day = String(currentDate.getDate()).padStart(2, "0");
    const month = String(currentDate.getMonth() + 1).padStart(2, "0");
    const year = currentDate.getFullYear();
    const hours = String(currentDate.getHours()).padStart(2, "0");
    const minutes = String(currentDate.getMinutes()).padStart(2, "0");
    const seconds = String(currentDate.getSeconds()).padStart(2, "0");
    const formattedDate = `${day}-${month}-${year}-${hours}-${minutes}-${seconds}`;

    const sanitizedClientNom = client.nom
      .replace(/[^\w\s.-]/gi, "")
      .replace(/\s+/g, "-");

    const filename = `Tarif-RC-${parcours.numParcours}-${sanitizedClientNom}-${formattedDate}`;

    res.setHeader(
      "Content-Type",
      "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
    );
    res.setHeader("Content-Disposition", "attachment; filename=" + filename + ".docx");
    res.send(buf);
  } catch (error) {
    logger.log("error", 'Error in RC tarif generation:', error);
    return res.status(500).send("Erreur lors de la génération du tarif RC");
  }
});



module.exports = router;