const {db} = require('../db/db-connect');
const logger = require('../utils/logger');
const globalService = require('../services/globalService');

async function getContratByNumContrat(numContrat) {
  const criteria = {
    filter: `numContrat='${numContrat}'`,
    expand: "client, intermediaire, rc, fac, tppc"
  };

  const resultat = await globalService.fetchInfoByCriteria('contrat', criteria)
  if (resultat) {
    return placerDansEnCours(await expandProjetTarif(resultat))
  }
}

async function getContratByNumSaisine(numSaisine) {
  const criteria = {
    filter: `numSaisine='${numSaisine}'`,
    expand: "client, intermediaire,  rc, fac, tppc"
  };

  const resultat = await globalService.fetchInfoByCriteria('contrat', criteria)
  if (resultat) {
    return placerDansEnCours(await expandProjetTarif(resultat))
  }
}

async function getContratById(id) {
  const criteria = {
    filter: `id='${id}'`,
    expand: "client, intermediaire, rc, fac, tppc"
  };

  const resultat = await globalService.fetchInfoByCriteria('contrat', criteria)
  if (resultat) {
    return placerDansEnCours(await expandProjetTarif(resultat))
  }
}

async function createContrat() {
  return await db.records.create('contrat', {});
}


async function expandProjetTarif(resultat) {
  const produit = resultat?.['produit'].toLowerCase()
  
  // RC utilise tarifRC/projetRC, les autres produits utilisent tarif/projet
  let idProjet, idTarif, collectionProjet, collectionTarif;
  if (produit === 'rc') {
    idProjet = resultat?.['@expand']?.[produit]?.['projetRC'] || undefined
    idTarif = resultat?.['@expand']?.[produit]?.['tarifRC'] || undefined
    collectionProjet = 'projetRC';  // Nom de collection RC
    collectionTarif = 'tarifRC';    // Nom de collection RC
  } else {
    idProjet = resultat?.['@expand']?.[produit]?.['projet'] || undefined
    idTarif = resultat?.['@expand']?.[produit]?.['tarif'] || undefined
    collectionProjet = produit + "projet";  // tppcprojet, facprojet
    collectionTarif = produit + "tarif";    // tppctarif, factarif (n'existe pas mais bon)
  }

  // Pour RC, inclure à la fois les clés RC spécifiques (tarifRC/projetRC) et les clés génériques (tarif/projet)
  // afin de rester compatible avec l'ancien front qui lisait `tarif`/`projet`.
  const expand = {
    projet: idProjet ? await db.records.getOne(collectionProjet, idProjet) : null,
    tarif: idTarif ? await db.records.getOne(collectionTarif, idTarif) : null,
  };

  if (produit === 'rc') {
    expand.projetRC = expand.projet;
    expand.tarifRC = expand.tarif;
  }

  resultat['@expand'][produit] = {...resultat['@expand'][produit], '@expand': expand}
  return resultat
}

function placerDansEnCours(result) {
  /* déplace le contenu du produit dans @expand:enCours 
  pour que le front y accède au même emplacement 
  quelque soit le type du produit*/

  if (result !== null && result.produit !== null) {
    switch (result.produit.toLowerCase()) {
      case 'rc':
        result["@expand"]['enCours'] = result['@expand'].rc;
        delete result["@expand"]['rc'];
        break;

      case 'fac':
        result["@expand"]['enCours'] = result['@expand'].fac;
        delete result["@expand"]['fac'];
        break;

      case 'tppc':
        result["@expand"]['enCours'] = result['@expand'].tppc;
        delete result["@expand"]['tppc']
        break;
    }
  }

  return result
}

module.exports = {
  getContratByNumContrat,
  getContratByNumSaisine,
  createContrat,
  getContratById
};