/**
 *
 * @param {Array} questionnaireItems
 * @returns {void}
 */
export default function (questionnaireItems) {
  questionnaireItems.forEach((questionnaireItem) => {
    let product = 1;
    let count = 0;
    let min = Number.POSITIVE_INFINITY;
    let max = Number.NEGATIVE_INFINITY;
    for (const quotation of questionnaireItem.quotations) {
      for (const quote of quotation.cleanedQuotes) {
        const price = parseFloat(quote.price);
        quote.price = price;
        if (price > 0) {
          product *= price;
          count++;
          min = Math.min(min, price);
          max = Math.max(max, price);
        }
      }
    }
    const geomean = count > 0 ? Math.pow(product, 1 / count) : 0;

    const stdev = Math.sqrt(
      questionnaireItem.quotations.reduce((sum, quotation) => {
        for (const quote of quotation.cleanedQuotes) {
          const price = parseFloat(quote.price);
          if (price > 0) sum += Math.pow(price - geomean, 2);
        }
        return sum;
      }, 0) / count
    );
    const variation = stdev / geomean;

    if (geomean > 0) {
      questionnaireItem.geomean = geomean.toFixed(2);
      questionnaireItem.stdev = stdev.toFixed(2);
      questionnaireItem.variation = variation.toFixed(2);
      questionnaireItem.min = min.toFixed(2);
      questionnaireItem.max = max.toFixed(2);
      questionnaireItem.product = product.toFixed(2);
      questionnaireItem.count = count.toFixed(2);
    }
  });
}

export function recalculateRow(rowData) {
  // console.log("Row date is: ", rowData);
  let product = 1;
  let count = 0;
  let min = Number.POSITIVE_INFINITY;
  let max = Number.NEGATIVE_INFINITY;
  for (const quotation of Object.values(rowData.quotes)) {
    for (const key of Object.keys(quotation)) {
      const price = parseFloat(quotation[key]);
      if (isOnlyQuote(key) && price > 0) {
        product *= price;
        count++;
        min = Math.min(min, parseFloat(price));
        max = Math.max(max, price);
      }
    }
  }
  const geomean = count > 0 ? Math.pow(product, 1 / count) : 0;

  const stdev = Math.sqrt(
    Object.values(rowData.quotes).reduce((sum, quotation) => {
      for (const key of Object.keys(quotation)) {
        const price = parseFloat(quotation[key]);
        if (isOnlyQuote(key) && price > 0) sum += Math.pow(price - geomean, 2);
      }
      return sum;
    }, 0) /
      (count - 1)
  );
  const variation = stdev / geomean;

  if (geomean > 0) {
    rowData.geomean = isNaN(geomean) ? "0" : geomean.toFixed(2);
    rowData.deviation = isNaN(stdev) ? "0" : stdev.toFixed(2);
    rowData.variation = isNaN(variation) ? "0" : variation.toFixed(2);
    rowData.minQ = isNaN(min) ? "0" : min.toFixed(2);
    rowData.maxQ = isNaN(max) ? "0" : max.toFixed(2);
    rowData.product = isNaN(product) ? "0" : product.toFixed(2);
    rowData.count = isNaN(count) ? "0" : count.toFixed(2);
    rowData.ratio = isNaN(max / min) ? "0" : (max / min).toFixed(2);
  }
  // console.log("Recalculated data: ", geomean, stdev, variation, rowData);
}

const isOnlyQuote = (str) => {
  return /^((?!_)[A-Za-z0-9])+$/.test(str);
};
Based on the above function calcucate the values  for variation, standard deviation and geomean of quotaion1 = 1 quotation2=10