import { DBFFile } from "dbffile";
import errorTypeCheck from "../../util/errorTypeCheck";
import { DecodedPflLine } from "../decoder/decode-pfl.interface";
import { pflFieldLineDescriptors } from "../util/ems-interface/fielddescriptors/pfl-field-descriptors";
import {
  deleteEmsFileIfExists,
  generateEmsOutFilePath,
} from "../util/ems-util";
import uppercaseObjectKeys from "../util/uppercaseObjectKeys";
import { EmsPartsOrder } from "./ems-parts-order-interfaces";
import _ from "lodash";

const EmsPartsOrderGeneratePflFile = async (
  partsOrder: EmsPartsOrder,
): Promise<boolean> => {
  try {
    let records;

    if (partsOrder.job.cieca_pfl && !_.isEmpty(partsOrder.job.cieca_pfl)) {
      records = Object.keys(partsOrder.job.cieca_pfl).map((key) => {
        const record: DecodedPflLine = partsOrder.job.cieca_pfl[key];
        return uppercaseObjectKeys(record);
      });
    } else {
      //We don't have the PFL data for an old job, so make it manually.

      records = [
        {
          LBR_TYPE: "LAA",
          LBR_DESC: "",
          LBR_RATE: partsOrder.job.rate_laa,
          LBR_TAX_IN: true,
          LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
          LBR_ADJP: 0,
          LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
          LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
          LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
          LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
          LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
          LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
          LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
          LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
          LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
          LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
        },
        {
          LBR_TYPE: "LAB",
          LBR_DESC: "",
          LBR_RATE: partsOrder.job.rate_lab,
          LBR_TAX_IN: true,
          LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
          LBR_ADJP: 0,
          LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
          LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
          LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
          LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
          LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
          LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
          LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
          LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
          LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
          LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
        },

        {
          LBR_TYPE: "LAD",
          LBR_DESC: "",
          LBR_RATE: partsOrder.job.rate_lad,
          LBR_TAX_IN: true,
          LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
          LBR_ADJP: 0,
          LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
          LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
          LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
          LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
          LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
          LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
          LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
          LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
          LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
          LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
        },
        {
          LBR_TYPE: "LAE",
          LBR_DESC: "",
          LBR_RATE: partsOrder.job.rate_lae,
          LBR_TAX_IN: true,
          LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
          LBR_ADJP: 0,
          LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
          LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
          LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
          LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
          LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
          LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
          LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
          LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
          LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
          LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
        },
        {
          LBR_TYPE: "LAF",
          LBR_DESC: "",
          LBR_RATE: partsOrder.job.rate_laf,
          LBR_TAX_IN: true,
          LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
          LBR_ADJP: 0,
          LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
          LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
          LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
          LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
          LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
          LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
          LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
          LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
          LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
          LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
        },
        {
          LBR_TYPE: "LAG",
          LBR_DESC: "",
          LBR_RATE: partsOrder.job.rate_lag,
          LBR_TAX_IN: true,
          LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
          LBR_ADJP: 0,
          LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
          LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
          LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
          LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
          LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
          LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
          LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
          LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
          LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
          LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
        },
        {
          LBR_TYPE: "LAM",
          LBR_DESC: "",
          LBR_RATE: partsOrder.job.rate_lam,
          LBR_TAX_IN: true,
          LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
          LBR_ADJP: 0,
          LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
          LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
          LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
          LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
          LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
          LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
          LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
          LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
          LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
          LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
        },
        {
          LBR_TYPE: "LAR",
          LBR_DESC: "",
          LBR_RATE: partsOrder.job.rate_lar,
          LBR_TAX_IN: true,
          LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
          LBR_ADJP: 0,
          LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
          LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
          LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
          LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
          LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
          LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
          LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
          LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
          LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
          LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
        },
        {
          LBR_TYPE: "LAS",
          LBR_DESC: "",
          LBR_RATE: partsOrder.job.rate_las,
          LBR_TAX_IN: true,
          LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
          LBR_ADJP: 0,
          LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
          LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
          LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
          LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
          LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
          LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
          LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
          LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
          LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
          LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
        },
        {
          LBR_TYPE: "LAU",
          LBR_DESC: "",
          LBR_RATE: partsOrder.job.rate_lau,
          LBR_TAX_IN: true,
          LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
          LBR_ADJP: 0,
          LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
          LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
          LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
          LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
          LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
          LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
          LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
          LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
          LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
          LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
        },
        {
          LBR_TYPE: "LA1",
          LBR_DESC: "",
          LBR_RATE: partsOrder.job.rate_la1,
          LBR_TAX_IN: true,
          LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
          LBR_ADJP: 0,
          LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
          LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
          LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
          LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
          LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
          LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
          LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
          LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
          LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
          LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
        },
        {
          LBR_TYPE: "LA2",
          LBR_DESC: "",
          LBR_RATE: partsOrder.job.rate_la2,
          LBR_TAX_IN: true,
          LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
          LBR_ADJP: 0,
          LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
          LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
          LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
          LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
          LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
          LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
          LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
          LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
          LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
          LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
        },
        {
          LBR_TYPE: "LA3",
          LBR_DESC: "",
          LBR_RATE: partsOrder.job.rate_la3,
          LBR_TAX_IN: true,
          LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
          LBR_ADJP: 0,
          LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
          LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
          LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
          LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
          LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
          LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
          LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
          LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
          LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
          LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
        },
        {
          LBR_TYPE: "LA4",
          LBR_DESC: "",
          LBR_RATE: partsOrder.job.rate_la4,
          LBR_TAX_IN: true,
          LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
          LBR_ADJP: 0,
          LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
          LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
          LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
          LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
          LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
          LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
          LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
          LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
          LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
          LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
        },
      ];
    }

    await deleteEmsFileIfExists(
      generateEmsOutFilePath(`${partsOrder.job.ciecaid}.PFL`),
    );

    const dbf: DBFFile = await DBFFile.create(
      generateEmsOutFilePath(`${partsOrder.job.ciecaid}.PFL`),
      pflFieldLineDescriptors,
    );

    await dbf.appendRecords(records);
    console.log(`${records.length} PFL file records added.`);
    return true;
  } catch (error) {
    console.error("Error generating PFL file:", errorTypeCheck(error));
    return false;
  }
};

export default EmsPartsOrderGeneratePflFile;
