// Column definitions for the progress-report table.
// Labels arrive already translated from the i18n file, and translateValue
// converts cell values (e.g. "Semester 1", "Sent") for the Khmer language.

import {
  DataTableDateCell,
  DataTableNumberCell,
  type DataTableColDef,
} from "@/components/ui/data-table";

import type { ProgressReportRow } from "../../progress-report-data";
import {
  progressReportText,
  type ProgressReportActionsMenuLabels,
  type ProgressReportCreateDialogLabels,
  type ProgressReportCreateMeetingDialogLabels,
  type ProgressReportSetDeadlineDialogLabels,
  type ProgressReportUploadDraftSemesterDialogLabels,
} from "../../progress-report-i18n";
import {
  ProgressReportActionCell,
  ProgressReportDocumentCell,
  ProgressReportStatusCell,
  ProgressReportTextCell,
} from "./progress-report-table-cells";
import type { ProgressReportRowActions } from "./progress-report-actions-menu";

const unavailableRowActions: ProgressReportRowActions = {
  editReport: () =>
    Promise.reject(new Error("Edit report action is not configured.")),
  createMeeting: () =>
    Promise.reject(new Error("Create meeting action is not configured.")),
  setDeadline: () =>
    Promise.reject(new Error("Set deadline action is not configured.")),
  uploadDraftSemester: () =>
    Promise.reject(new Error("Draft upload action is not configured.")),
};

export type ProgressReportColumnLabels = {
  no: string;
  title: string;
  year: string;
  deadline: string;
  firstMeeting: string;
  secondDeadline: string;
  secondMeeting: string;
  finalDeadline: string;
  draftSemester: string;
  reportDoc: string;
  status: string;
  actions: string;
};

export function getProgressReportTableColumns(
  labels: ProgressReportColumnLabels,
  translateValue: (value: string) => string = (value) => value,
  actionsMenuLabels: ProgressReportActionsMenuLabels = progressReportText.en
    .actionsMenu,
  editReportLabels: ProgressReportCreateDialogLabels = progressReportText.en
    .createDialog,
  uploadDraftSemesterLabels: ProgressReportUploadDraftSemesterDialogLabels = progressReportText
    .en.uploadDraftSemesterDialog,
  createMeetingLabels: ProgressReportCreateMeetingDialogLabels = progressReportText
    .en.createMeetingDialog,
  setDeadlineLabels: ProgressReportSetDeadlineDialogLabels = progressReportText
    .en.setDeadlineDialog,
  rowActions: ProgressReportRowActions = unavailableRowActions,
): DataTableColDef<ProgressReportRow>[] {
  const columnWidth = 150;
  const dateColumnWidth = 160;

  const fixedColumn = (
    column: DataTableColDef<ProgressReportRow>,
  ): DataTableColDef<ProgressReportRow> => ({
    flex: 0,
    minWidth: column.width,
    sortable: false,
    ...column,
  });

  const flexColumn = (
    column: DataTableColDef<ProgressReportRow> & {
      flex: number;
      minWidth: number;
    },
  ): DataTableColDef<ProgressReportRow> => ({
    sortable: false,
    ...column,
  });

  return [
    fixedColumn({
      field: "no",
      headerName: labels.no,
      width: 52,
      align: "center",
      headerAlign: "center",
      filterable: false,
      disableColumnMenu: true,
      renderCell: (params) => <DataTableNumberCell value={params.row.id} />,
    }),
    flexColumn({
      field: "title",
      headerName: labels.title,
      flex: 1.25,
      minWidth: 180,
      headerAlign: "center",
      renderCell: (params) => (
        <ProgressReportTextCell value={translateValue(params.row.title)} />
      ),
    }),
    fixedColumn({
      field: "year",
      headerName: labels.year,
      width: 70,
      headerAlign: "center",
      renderCell: (params) => (
        <DataTableNumberCell value={params.row.year} align="left" />
      ),
    }),
    fixedColumn({
      field: "deadline",
      headerName: labels.deadline,
      width: dateColumnWidth,
      headerAlign: "center",
      renderCell: (params) => (
        <DataTableDateCell
          value={params.row.deadline}
          align="left"
          showTooltip={false}
        />
      ),
    }),
    fixedColumn({
      field: "firstMeeting",
      headerName: labels.firstMeeting,
      width: dateColumnWidth,
      headerAlign: "center",
      renderCell: (params) => (
        <DataTableDateCell
          value={params.row.firstMeeting}
          align="left"
          showTooltip={false}
        />
      ),
    }),
    fixedColumn({
      field: "secondDeadline",
      headerName: labels.secondDeadline,
      width: dateColumnWidth,
      headerAlign: "center",
      renderCell: (params) => (
        <DataTableDateCell
          value={params.row.secondDeadline}
          align="left"
          showTooltip={false}
        />
      ),
    }),
    fixedColumn({
      field: "secondMeeting",
      headerName: labels.secondMeeting,
      width: dateColumnWidth,
      headerAlign: "center",
      renderCell: (params) => (
        <DataTableDateCell
          value={params.row.secondMeeting}
          align="left"
          showTooltip={false}
        />
      ),
    }),
    fixedColumn({
      field: "finalDeadline",
      headerName: labels.finalDeadline,
      width: dateColumnWidth,
      headerAlign: "center",
      renderCell: (params) => (
        <DataTableDateCell
          value={params.row.finalDeadline}
          align="left"
          showTooltip={false}
        />
      ),
    }),
    fixedColumn({
      field: "draftSemesterDoc",
      headerName: labels.draftSemester,
      width: columnWidth,
      headerAlign: "center",
      renderCell: (params) => (
        <ProgressReportDocumentCell file={params.row.draftSemesterDoc} />
      ),
    }),
    fixedColumn({
      field: "reportDoc",
      headerName: labels.reportDoc,
      width: columnWidth,
      headerAlign: "center",
      renderCell: (params) => (
        <ProgressReportDocumentCell file={params.row.reportDoc} />
      ),
    }),
    fixedColumn({
      field: "status",
      headerName: labels.status,
      width: 124,
      align: "center",
      headerAlign: "center",
      renderCell: (params) => (
        <ProgressReportStatusCell
          status={params.row.status}
          label={translateValue(params.row.status)}
        />
      ),
    }),
    fixedColumn({
      field: "actions",
      headerName: labels.actions,
      width: 82,
      align: "center",
      headerAlign: "center",
      filterable: false,
      disableColumnMenu: true,
      renderCell: (params) => (
        <ProgressReportActionCell
          menuLabels={actionsMenuLabels}
          editReportLabels={editReportLabels}
          uploadDraftSemesterLabels={uploadDraftSemesterLabels}
          createMeetingLabels={createMeetingLabels}
          setDeadlineLabels={setDeadlineLabels}
          report={params.row}
          rowActions={rowActions}
        />
      ),
    }),
  ];
}
