const KNOWN_PART_RATE_TYPES = [
  "PAA",
  "PAC",
  "PAG",
  "PAL",
  "PAM",
  "PAN",
  "PAO",
  "PAP",
  "PAR",
  "PAS",
  "PASL",
  "CCC",
  "CCD",
  "CCF",
  "CCM",
  "CCDR"
];

/**
 * Extracts and processes parts tax rates from profile info.
 * @param {object} profile - The ProfileInfo object from XML.
 * @returns {object} The parts tax rates object.
 */

//TODO: Major validation would be required on this - EMS files are inconsistent with things like 5% being passed as 5.0 or .05.
const extractPartsTaxRates = (profile = {}) => {
  const rateInfos = Array.isArray(profile.RateInfo) ? profile.RateInfo : [profile.RateInfo || {}];
  const partsTaxRates = {};

  /**
   * In this context, r.RateType._ accesses the property named _ on the RateType object.
   * This pattern is common when handling data parsed from XML, where element values are stored under the _ key. So,
   * _ aligns to the actual value/content of the RateType field when RateType is an object (not a string).
   */
  for (const r of rateInfos) {
    const rateTypeRaw =
      typeof r?.RateType === "string"
        ? r.RateType
        : typeof r?.RateType === "object" && r?.RateType._
          ? r.RateType._
          : "";
    const rateType = (rateTypeRaw || "").toUpperCase();
    if (!KNOWN_PART_RATE_TYPES.includes(rateType)) continue;

    const taxInfo = r.TaxInfo;
    const taxTier = taxInfo?.TaxTierInfo;
    let percentage = parseFloat(taxTier?.Percentage ?? "NaN");

    if (isNaN(percentage)) {
      const tierRate = Array.isArray(r.RateTierInfo) ? r.RateTierInfo[0]?.Rate : r.RateTierInfo?.Rate;
      percentage = parseFloat(tierRate ?? "NaN");
    }

    if (!isNaN(percentage)) {
      partsTaxRates[rateType] = {
        prt_discp: 0,
        prt_mktyp: false,
        prt_mkupp: 0,
        prt_tax_in: true,
        prt_tax_rt: percentage / 100
      };
    }
  }

  return partsTaxRates;
};

module.exports = {
  extractPartsTaxRates,
  KNOWN_PART_RATE_TYPES
};
