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()
  
  if (!produit) return resultat;
  
  // Récupérer les IDs des collections projet et tarif selon le produit
  let idProjet, idTarif, projetCollectionName, tarifCollectionName;
  
  if (produit === 'rc') {
    idProjet = resultat?.['@expand']?.[produit]?.['projetRC'] || undefined
    idTarif = resultat?.['@expand']?.[produit]?.['tarifRC'] || undefined
    projetCollectionName = 'projetRC'
    tarifCollectionName = 'tarifRC'
  } else if (produit === 'fac') {
    idProjet = resultat?.['@expand']?.[produit]?.['projet'] || undefined
    idTarif = resultat?.['@expand']?.[produit]?.['tarif'] || undefined
    projetCollectionName = 'facProjet'
    tarifCollectionName = 'facTarif'
  } else if (produit === 'tppc') {
    idProjet = resultat?.['@expand']?.[produit]?.['projet'] || undefined
    idTarif = resultat?.['@expand']?.[produit]?.['tarif'] || undefined
    projetCollectionName = 'tppcProjet'
    tarifCollectionName = 'tppcTarif'
  }

  const expand = {
    projetRC: (idProjet && produit === 'rc') ? await db.records.getOne(projetCollectionName, idProjet) : null,
    tarifRC: (idTarif && produit === 'rc') ? await db.records.getOne(tarifCollectionName, idTarif) : null,
    projet: (idProjet && produit !== 'rc') ? await db.records.getOne(projetCollectionName, idProjet) : null,
    tarif: (idTarif && produit !== 'rc') ? await db.records.getOne(tarifCollectionName, idTarif) : null
  }
  
  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
};