/* eslint-disable import/prefer-default-export */
// eslint-disable-next-line import/extensions
import { Workbook } from 'excel4node';
import { ReportType } from './types';

const formatRouteId = (row: ReportType) => row.routeId;
const formatDispatcher = (row: ReportType) => row.dispatcher;
const formatStartDate = (row: ReportType) => row.startDate;
const formatEndDate = (row: ReportType) => row.endDate;
const formatExpectedArrival = (row: ReportType) => row.expectedTime;
const formatActualArrival = (row: ReportType) => row.actualTime;
const formatTimeDifference = (row: ReportType) => row.timeDifference;

const isNil = (value: any) => {
  const isNull = value == null;
  const isUndefined = value === undefined;
  return isNull || isUndefined;
};
const writeRow = (workSheet: any, rowNum: number, data: any[]) => {
  data.forEach((element, i) => {
    if (isNil(element)) {
      return;
    }

    if (typeof element === 'number') {
      workSheet.cell(rowNum, i + 1).number(element);
    } else {
      workSheet.cell(rowNum, i + 1).string(`${element}`);
    }
  });
};

export const generateXLSX = async (rows: ReportType[]) => {
  const Headers = [
    'Route ID',
    'Dispatcher Assigned',
    'Start Date',
    'End Date',
    'Expected Arrival Time',
    'Actual Arrival Time',
    'Time Difference',
  ];

  const workBook = new Workbook();
  const workSheet = workBook.addWorksheet('Route Report');

  const firstRowNumber = 2;

  rows.forEach((row: ReportType, i: number) => {
    const rowNum = i + firstRowNumber;

    writeRow(workSheet, rowNum, [
      formatRouteId(row),
      formatDispatcher(row),
      formatStartDate(row),
      formatEndDate(row),
      formatExpectedArrival(row),
      formatActualArrival(row),
      formatTimeDifference(row),
    ]);
  });

  writeRow(workSheet, 1, Headers);

  workSheet.column(1).setWidth(24);
  workSheet.column(2).setWidth(30);
  workSheet.column(3).setWidth(10);
  workSheet.column(4).setWidth(10);
  workSheet.column(5).setWidth(19);
  workSheet.column(6).setWidth(17);
  workSheet.column(7).setWidth(14);

  return {
    metadata: {
      name: `RMS-Route-Report.xlsx`,
      mimeType:
        'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    },
    file: await workBook.writeToBuffer(),
  };
};
