const { DBFFile } = require("dbffile");
const path = require("path");
const _ = require("lodash");

async function DecodeEstimate(filePath) {
  const parsedFilePath = path.parse(filePath);
  let extensionlessFilePath = path.join(
    parsedFilePath.dir,
    parsedFilePath.name
  );
  console.log("DecodeEstimate -> extensionlessFilePath", extensionlessFilePath);
  const ret = {
    ...(await DecodeAd1File(extensionlessFilePath)),
    ...(await DecodeVehFile(extensionlessFilePath)),
    ...(await DecodeTtlFile(extensionlessFilePath)),
    ...(await DecodeLinFile(extensionlessFilePath)),
  };

  if (ret.V_MILEAGE > 20000) return ret;
  return null;
}

async function DecodeAd1File(extensionlessFilePath) {
  let dbf = await DBFFile.open(`${extensionlessFilePath}A.AD1`);
  let records = await dbf.readRecords(1);
  return _.pick(records[0], [
    // "INS_CO_ID",
    "INS_CO_NM",
    // "INS_ADDR1",
    // "INS_ADDR2",
    // "INS_CITY",
    // "INS_ST",
    // "INS_ZIP",
    // "INS_CTRY",

    // "INS_EA",
    // "POLICY_NO",
    // "DED_AMT",
    // "DED_STATUS",
    // "ASGN_NO",
    //"ASGN_DATE",
    // "ASGN_TYPE",
    "CLM_NO",
    // "CLM_OFC_ID",
    // "CLM_OFC_NM",
    // "CLM_ADDR1",
    // "CLM_ADDR2",
    // "CLM_CITY",
    // "CLM_ST",
    // "CLM_ZIP",
    // "CLM_CTRY",
    // "CLM_PH1",
    // "CLM_PH1X",
    // "CLM_PH2",
    // "CLM_PH2X",
    // "CLM_FAX",
    // "CLM_FAXX",
    // "CLM_CT_LN",
    // "CLM_CT_FN",
    // "CLM_TITLE",
    // "CLM_CT_PH",
    // "CLM_CT_PHX",
    // "CLM_EA",
    // "PAYEE_NMS",
    // "PAY_TYPE",
    // "PAY_DATE",
    // "PAY_CHKNM",
    // "PAY_AMT",
    // "AGT_CO_ID",
    // "AGT_CO_NM",
    // "AGT_ADDR1",
    // "AGT_ADDR2",
    // "AGT_CITY",
    // "AGT_ST",
    // "AGT_ZIP",
    // "AGT_CTRY",
    // "AGT_PH1",
    // "AGT_PH1X",
    // "AGT_PH2",
    // "AGT_PH2X",
    // "AGT_FAX",
    // "AGT_FAXX",
    // "AGT_CT_LN",
    // "AGT_CT_FN",
    // "AGT_CT_PH",
    // "AGT_CT_PHX",
    // "AGT_EA",
    // "AGT_LIC_NO",
    "LOSS_DATE",
    // "LOSS_TYPE",
    // "LOSS_DESC",
    // "THEFT_IND",
    // "CAT_NO",
    // "TLOS_IND",
    // "CUST_PR",
    // "INSD_LN",
    // "INSD_FN",
    // "INSD_TITLE",
    // "INSD_CO_NM",
    // "INSD_ADDR1",
    // "INSD_ADDR2",
    // "INSD_CITY",
    // "INSD_ST",
    // "INSD_ZIP",
    // "INSD_CTRY",
    // "INSD_PH1",
    // "INSD_PH1X",
    // "INSD_PH2",
    // "INSD_PH2X",
    // "INSD_FAX",
    // "INSD_FAXX",
    // "INSD_EA",
    "OWNR_LN",
    "OWNR_FN",
    // "OWNR_TITLE",
    // "OWNR_CO_NM",
    // "OWNR_ADDR1",
    // "OWNR_ADDR2",
    // "OWNR_CITY",
    // "OWNR_ST",
    // "OWNR_ZIP",
    // "OWNR_CTRY",
    // "OWNR_PH1",
    // "OWNR_PH1X",
    // "OWNR_PH2",
    // "OWNR_PH2X",
    // "OWNR_FAX",
    // "OWNR_FAXX",
    // "OWNR_EA",
    // "INS_PH1",
    // "INS_PH1X",
    // "INS_PH2",
    // "INS_PH2X",
    // "INS_FAX",
    // "INS_FAXX",
    // "INS_CT_LN",
    // "INS_CT_FN",
    // "INS_TITLE",
    // "INS_CT_PH",
    // "INS_CT_PHX",
    // "LOSS_CAT",
  ]);
}
async function DecodeVehFile(extensionlessFilePath) {
  let dbf = await DBFFile.open(`${extensionlessFilePath}V.VEH`);
  let records = await dbf.readRecords(1);
  return _.pick(records[0], [
    // "IMPACT_1",
    // "IMPACT_2",
    // "DB_V_CODE",
    // "PLATE_NO",
    // "PLATE_ST",
    "V_VIN",
    // "V_COND",
    // "V_PROD_DT",
    "V_MODEL_YR",
    // "V_MAKECODE",
    "V_MAKEDESC",
    "V_MODEL",
    "V_TYPE",
    "V_MILEAGE",
    // "V_BSTYLE",
    // "V_TRIMCODE",
    // "TRIM_COLOR",
    // "V_MLDGCODE",
    // "V_ENGINE",
    // "V_COLOR",
    // "V_TONE",
    // "V_STAGE",
    // "PAINT_CD1",
    // "PAINT_CD2",
    // "PAINT_CD3",
  ]);
}
async function DecodeTtlFile(extensionlessFilePath) {
  let dbf = await DBFFile.open(`${extensionlessFilePath}.TTL`);
  let records = await dbf.readRecords(1);
  return { clm_total: records[0]["G_TTL_AMT"] };
}

async function DecodeLinFile(extensionlessFilePath) {
  let dbf = await DBFFile.open(`${extensionlessFilePath}.LIN`);
  let records = await dbf.readRecords();

  let joblines = records.map((record) =>
    _.transform(
      _.pick(record, [
        "LINE_NO",
        "LINE_IND",
        // "LINE_REF",
        // "TRAN_CODE",
        "DB_REF",
        "UNQ_SEQ",
        //  "WHO_PAYS",
        "LINE_DESC",
        "PART_TYPE",
        //  "PART_DESCJ",
        "GLASS_FLAG",
        "OEM_PARTNO",
        //  "PRICE_INC",
        //  "ALT_PART_I",
        //  "TAX_PART",
        "DB_PRICE",
        "ACT_PRICE",
        //   "PRICE_J",
        //  "CERT_PART",
        "PART_QTY",
        // "ALT_CO_ID",
        // "ALT_PARTNO",
        // "ALT_OVERRD",
        // "ALT_PARTM",
        // "PRT_DSMK_P",
        // "PRT_DSMK_M",
        // "MOD_LBR_TY",
        // "DB_HRS",
        // "MOD_LB_HRS",
        // "LBR_INC",
        // "LBR_OP",
        // "LBR_HRS_J",
        // "LBR_TYP_J",
        // "LBR_OP_J",
        // "PAINT_STG",
        // "PAINT_TONE",
        // "LBR_TAX",
        // "LBR_AMT",
        // "MISC_AMT",
        // "MISC_SUBLT",
        // "MISC_TAX",
        // "BETT_TYPE",
        // "BETT_PCTG",
        // "BETT_AMT",
        // "BETT_TAX",
      ]),
      function (result, val, key) {
        //Required because unq_seq gets pulled as a numeric instaed of a string.
        if (key === "UNQ_SEQ") {
          return (result[key.toLowerCase()] = val.toString());
        }
        return (result[key.toLowerCase()] = val);
      }
    )
  );

  //Perform required RPS Validations.
  //Update DB Prices.
  const massagedJobLines = joblines
    .filter(
      (jobline) =>
        !jobline.db_ref.startsWith("900") &&
        (jobline.part_type && jobline.part_type.toUpperCase()) !== "PAG" &&
        jobline.glass_flag === false
    )
    .map((jobline) => {
      //
      if (
        (jobline.db_price === null || jobline.db_price === 0) &&
        !!jobline.act_price &&
        jobline.act_price > 0
      ) {
        jobline.db_price = jobline.act_price;
      }

      if (
        jobline.db_price &&
        jobline.act_price &&
        jobline.act_price > jobline.db_price
      ) {
        jobline.db_price = jobline.act_price;
      }

      delete jobline.glass_flag;
      return jobline;
    });

  return { joblines: { data: massagedJobLines } };
}

exports.DecodeEstimate = DecodeEstimate;
