import i18next from "i18next";
import _ from "lodash";

export const reconcileByAssocLine = (jobLines, jobLineState, billLines, billLineState, setErrors) => {
  const [selectedBillLines, setSelectedBillLines] = billLineState;
  const [selectedJobLines, setSelectedJobLines] = jobLineState;

  const allJoblinesFromBills = billLines
    .filter((bl) => bl.joblineid && bl.jobline && !bl.jobline.removed)
    .map((bl) => bl.joblineid);

  const duplicatedJobLinesbyInvoiceId = _.filter(allJoblinesFromBills, (val, i, iteratee) =>
    _.includes(iteratee, val, i + 1)
  );

  if (duplicatedJobLinesbyInvoiceId.length > 0)
    setErrors((errors) => [
      ...errors,
      ..._.uniqBy(duplicatedJobLinesbyInvoiceId).map((dupedId) => {
        return i18next.t("jobs.labels.reconciliation.multiplebilllines", {
          line_desc: jobLines.find((j) => j.id === dupedId)?.line_desc
        });
      })
    ]);

  setSelectedBillLines(
    _.union(
      selectedBillLines,
      billLines.filter((bl) => !!bl.joblineid).map((bl) => bl.id)
    )
  );

  setSelectedJobLines(_.union(selectedJobLines, _.uniqBy(allJoblinesFromBills)));
};

export const reconcileByPrice = (jobLines, jobLineState, billLines, billLineState, setErrors) => {
  const [selectedBillLines, setSelectedBillLines] = billLineState;
  const [selectedJobLines, setSelectedJobLines] = jobLineState;

  const allActPricesFromJobs = jobLines.map((jl) => jl.act_price);
  const duplicateActPrices = _.filter(allActPricesFromJobs, (val, i, iteratee) => _.includes(iteratee, val, i + 1));

  if (duplicateActPrices.length > 0)
    setErrors((errors) => [
      ...errors,
      ..._.uniqBy(duplicateActPrices).map((dupeAp) =>
        i18next.t("jobs.labels.reconciliation.multipleactprices", {
          act_price: dupeAp
        })
      )
    ]);

  const foundJobLines = [];
  var foundBillLines = [];
  const actPricesWithMoreThan1MatchingBill = [];

  jobLines.forEach((jl) => {
    const matchingBillLineIds = billLines
      .filter((bl) => bl.actual_price === jl.act_price && bl.quantity === jl.part_qty && !jl.removed)
      .map((bl) => bl.id);

    if (matchingBillLineIds.length > 1) {
      actPricesWithMoreThan1MatchingBill.push(jl.act_price);
    }

    foundBillLines = [...foundBillLines, ...matchingBillLineIds];
    if (matchingBillLineIds.length > 0) {
      foundJobLines.push(jl.id);
    }
  });

  setErrors((errors) => [
    ...errors,
    ..._.uniqBy(duplicateActPrices).map((dupeAp) =>
      i18next.t("jobs.labels.reconciliation.multipleactprices", {
        act_price: dupeAp
      })
    ),
    ..._.uniqBy(actPricesWithMoreThan1MatchingBill).map((act_price) =>
      i18next.t("jobs.labels.reconciliation.multiplebillsforactprice", {
        act_price: act_price
      })
    )
  ]);

  setSelectedBillLines(_.union(selectedBillLines, _.uniqBy(foundBillLines)));

  setSelectedJobLines(_.union(selectedJobLines, _.uniqBy(foundJobLines)));
};
