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

async function getParcoursByNumParcours(numParcours) {
	const criteria = { filter: `numParcours='${numParcours}'`, expand: `dernierUtilisateur.region, contrat` };

	return globalService.fetchInfoByCriteria("parcours", criteria);
}

// get All parcours saved in DB
async function getAllParcours() {
	try {
		const criteria = { expand: "dernierUtilisateur, contrat, region" };
		const resultList = await db.records.getList("parcours", 1, 200, criteria);

		return resultList;
	} catch (error) {
		logger.log('error', error);
		return null;
	}
}

// get all parcours filtred on region
async function getParcoursByRegion(regionUser) {
	try {
		// Récupérer les enregistrements de la collection "parcours"
		const filter = `dernierUtilisateur.region.nom = "${regionUser}"`;
		const parcoursRecords = await db.records.getFullList("parcours", 200, {
			sort: "-created",
			filter: filter,
			expand: "contrat, dernierUtilisateur.region, contrat.intermediaire",
		});

	// Récupérer les relations client pour chaque contrat
	for (const record of parcoursRecords) {
	  const contrat = record["@expand"].contrat;
	  if (contrat && contrat.client) {
		const clientRecord = await db.records.getOne("client", contrat.client);
		record["@expand"].contrat.client = clientRecord;
	  }
	}

	return parcoursRecords;
  } catch (error) {
	logger.log('error', error);
	throw error;
  }
}

async function createNewEmptyParcours(numParcours) {
	try {
		const data = { ["numParcours"]: numParcours };
		const record = await db.records.create("parcours", data);

		if (record) {
			return record.id;
		} else {
			return null;
		}
	} catch (error) {
		logger.log("error", error);

		return null;
	}
}

async function updateFieldValueParcours(id, field, value) {
	try {
		const data = { [field]: value };
		const record = await db.records.update("parcours", id, data);

		if (record) {
			return record.id;
		} else {
			return null;
		}
	} catch (error) {
		logger.log("error", error);

		return null;
	}
}

async function getNewParcoursNumber() {
	try {
		// fetch a paginated records list en utilisant le filtre pour le parcours
		const resultList = await db.records.getFullList("parcours", 99999999, { sort: "-numParcours", });

		if (resultList.length > 0) {
			const lastNumParcours = resultList[0].numParcours;

			// Extrait les chiffres du numéro de parcours
			const numericPart = lastNumParcours.substring(1); // Supprime le "P" initial
			const numericValue = parseInt(numericPart, 10);

			if (!isNaN(numericValue)) {
				const newNumericValue = numericValue + 1;
				const newNumParcours = "P" + newNumericValue.toString().padStart(9, "0");

				return newNumParcours;
			}
		} else {
			return null;
		}
	} catch (error) {
		logger.log("error", error);

		return null;
	}
}

module.exports = {
	getNewParcoursNumber,
	getParcoursByNumParcours,
	createNewEmptyParcours,
	updateFieldValueParcours,
	getAllParcours,
	getParcoursByRegion,
};
