import type {NextApiRequest, NextApiResponse} from "next";
import * as XLSX from "xlsx";

// Handle file upload and parse Excel data
export const handleFileUpload = async (file: File) => {
  const reader = new FileReader();
  return new Promise<{
    managerRecords: { imo: string; manager: string }[];
  }>((resolve) => {
    reader.onload = (e) => {
      const data = e.target?.result;
      const workbook = XLSX.read(data, { type: "binary" });
      const managerWorksheet = workbook.Sheets["Recent Changes (EffControl)"];

      // Extract IMO and EffectiveControl columns dynamically by header name
      const managerData = XLSX.utils.sheet_to_json<any>(managerWorksheet, {
        header: 1,
      });
      const headers = managerData[0];
      const imoIndex = headers.findIndex(
        (header: string) => header === "IMONumber",
      );
      const managerIndex = headers.findIndex(
        (header: string) => header === "EffectiveControl",
      );

      const managerRecords = managerData
        .slice(1)
        .map((row: any) => ({
          imo: row[imoIndex],
          manager: row[managerIndex],
        }))
        .filter((record) => record.imo && record.manager); // Filter out empty rows

      resolve({ managerRecords });
    };
    reader.readAsBinaryString(file);
  });
};

// API handler for menteithUpdate
export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse,
) {
  switch (req.method) {
    case "POST":
      if (req.body.action === "previewData") {
        try {
          const file = req.body.file;
          const { managerRecords } = await handleFileUpload(file);
          return res.status(200).json({ success: true, managerRecords });
        } catch (error) {
          return res
            .status(500)
            .json({ success: false, error: (error as Error).message });
        }
      }
      return res.status(400).json({ success: false, error: "Invalid action" });

    default:
      res.setHeader("Allow", ["POST"]);
      return res
        .status(405)
        .send(`Method ${req.method ?? "Undefined"} Not Allowed`);
  }
}