const errorHandling                    = require('../../utils/errorHandling');
const { requiredFields, generalError } = require('../../config/errors');
const formatNumberResult               = require('../secondary/formatNumberResult');

const correspondancesDistance = ["pm", null, null, "nm", null, null, "µm", null, null, "mm", "cm", "dm", "m", "dam", "hm", "km", null, null, "Mm", null, null, "Gm", null, null, "Tm"];

/** 
 * @description Convertis la longueur (distance) avec les unités allant de picomètre au Téramètre.
 * @requires {@link correspondancesDistance}
 * @param {Number} firstValue - Le nombre que vous voulez convertir
 * @param {String} unitFirstValue - L'unité du nombre que vous voulez convertir
 * @param {String} unitFinalValue -  L'unité de votre nombre après la conversion
 * @returns {Object|Boolean} → false si arguments non valides et sinon un objet contenant la string et le nombre résultat
 * @examples convertDistance(500, 'cm', 'm') → { resultNumber: 5, resultString: "5 m" }
 */
function convertDistance(firstValue, unitFirstValue, unitFinalValue) {
    const index1 = correspondancesDistance.indexOf(unitFirstValue); 
    const index2 = correspondancesDistance.indexOf(unitFinalValue);
    if (index1 !== -1 && index2 !== -1) {
        const difference = index1 - index2; 
        const result = firstValue * Math.pow(10, difference);
        return {
            result,
            resultHTML: `<p>${formatNumberResult(firstValue)} ${unitFirstValue} = ${formatNumberResult(result)} ${unitFinalValue}</p>`
        };
    }
    return false;
}

/* OUTPUTS */
module.exports = convertDistanceOutput = ({ res, next }, argsObject) => {
    let { number, numberUnit, finalUnit } = argsObject;
    
    // S'il n'y a pas les champs obligatoire
    if (!(number && numberUnit && finalUnit)) {
        return errorHandling(next, requiredFields);
    }

    // Si ce n'est pas un nombre
    number = parseFloat(number);
    if (isNaN(number)) {
        return errorHandling(next, { message: "Veuillez rentré un nombre valide.", statusCode: 400 });
    }

    const result = convertDistance(number, numberUnit, finalUnit);
    if (!result) {
        return errorHandling(next, generalError);
    }

    return res.status(200).json(result);
}