/**
 *
 * @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
  );
  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);
};
 the above function caclulated statistical values for quotaions of questionnaireItems where quotations are prices. So for every price count is keeping count of the prices greater than zero but standard  deviation is not being calculated correct when updating prices