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()
  const idProjet = resultat?.['@expand']?.[produit]?.['projet'] || undefined
  const idTarif = resultat?.['@expand']?.[produit]?.['tarif'] || undefined

  const expand = {
    projet: (idProjet) ? await db.records.getOne(produit + "projet", idProjet) : null,
    tarif: (idTarif) ? await db.records.getOne(produit + "tarif", 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
};