// Column definitions for the ministry / PSWG progress-report table.
// Layout (widths + alignment) matches the CDC-GPSF table. Actions stay
// read-only with a compact view control instead of the CDC edit menu.

import {
  DataTableDateCell,
  DataTableNumberCell,
  type DataTableColDef,
} from "@/components/ui/data-table";
import type { ProgressReportColumnLabels } from "@/features/cdc-gpsf/progress-report/components/table/progress-report-table-columns";

import type { ProgressReportRow } from "../../progress-report-data";
import {
  ProgressReportActionCell,
  ProgressReportDocumentCell,
  ProgressReportStatusCell,
  ProgressReportTextCell,
} from "./progress-report-table-cells";

export function getProgressReportTableColumns(
  labels: ProgressReportColumnLabels,
  translateValue: (value: string) => string,
  viewDetailLabel: string,
  actions?: {
    onView?: (row: ProgressReportRow) => void;
  },
): 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: "id",
      headerName: labels.no,
      width: 52,
      align: "center",
      headerAlign: "center",
      filterable: false,
      disableColumnMenu: true,
      renderCell: (params) => (
        <DataTableNumberCell
          value={params.api.getRowIndexRelativeToVisibleRows(params.row.id) + 1}
        />
      ),
    }),
    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: "thirdDeadline",
      headerName: labels.finalDeadline,
      width: dateColumnWidth,
      headerAlign: "center",
      renderCell: (params) => (
        <DataTableDateCell
          value={params.row.thirdDeadline}
          align="left"
          showTooltip={false}
        />
      ),
    }),
    fixedColumn({
      field: "draftSemester",
      headerName: labels.draftSemester,
      width: columnWidth,
      headerAlign: "center",
      renderCell: (params) => (
        <ProgressReportDocumentCell file={params.row.draftSemester} />
      ),
    }),
    fixedColumn({
      field: "reportDoc",
      headerName: labels.reportDoc,
      width: columnWidth,
      headerAlign: "center",
      renderCell: (params) => (
        <ProgressReportDocumentCell file={params.row.reportDoc} />
      ),
    }),
    fixedColumn({
      field: "status",
      headerName: labels.status,
      width: 145,
      align: "center",
      headerAlign: "center",
      renderCell: (params) => (
        <ProgressReportStatusCell
          status={params.row.status}
          label={translateValue(params.row.status)}
        />
      ),
    }),
    fixedColumn({
      field: "actions",
      headerName: labels.actions,
      width: 132,
      align: "center",
      headerAlign: "center",
      filterable: false,
      disableColumnMenu: true,
      renderCell: (params) => (
        <ProgressReportActionCell
          row={params.row}
          label={viewDetailLabel}
          onView={actions?.onView}
        />
      ),
    }),
  ];
}
