import {
    DataTableDateCell,
    DataTableNumberCell,
    type DataTableColDef,
} from "@/components/ui/data-table";
import type { MeetingRequest } from "../../meeting-request-data";
import {
    MeetingActionCell,
    MeetingDocumentCell,
    MeetingIssueCell,
    MeetingStatusCell,
    MeetingTextCell,
    MeetingTitleCell,
} from "./meeting-requests-table-cells";
import { MEETING_REQUEST_COLUMN_WIDTH } from "./meeting-requests-table-config";

export type MeetingRequestColumnKey =
    | "title"
    | "status"
    | "issueCount"
    | "documentName"
    | "requestedDate"
    | "requestedBy"
    | "action";

export type MeetingRequestTextColumnKey = Exclude<
    MeetingRequestColumnKey,
    "action"
>;

export type MeetingRequestTableColumn = {
    key: MeetingRequestColumnKey;
    label: string;
    width?: number | string;
    align?: "left" | "center" | "right";
};

export type MeetingRequestTableLabels = {
    no: string;
    meetingTitle: string;
    status: string;
    issues: string;
    meetingRequest: string;
    requestedDate: string;
    requestedBy: string;
};

export function getMeetingRequestTableColumns(
    labels: MeetingRequestTableLabels,
    statusLabels: Record<MeetingRequest["status"], string>,
    actions: {
        onView?: (row: MeetingRequest) => void;
        onCreateMeeting?: (row: MeetingRequest) => void;
    }
): DataTableColDef<MeetingRequest>[] {
    return [
        {
            field: "id",
            headerName: labels.no,
            width: 72,
            minWidth: 72,
            align: "center",
            headerAlign: "center",
            sortable: false,
            filterable: false,
            disableColumnMenu: true,
            renderCell: (params) => (
                <DataTableNumberCell
                    value={
                        params.api.getRowIndexRelativeToVisibleRows(params.row.id) +
                        1
                    }
                />
            ),
        },
        {
            field: "title",
            headerName: labels.meetingTitle,
            width: 266,
            sortable: false,
            renderCell: (params) => <MeetingTitleCell row={params.row} />,
        },
        {
            field: "status",
            headerName: labels.status,
            width: 119,
            sortable: false,
            align: "center",
            headerAlign: "left",
            renderCell: (params) => (
                <MeetingStatusCell
                    row={params.row}
                    label={statusLabels[params.row.status]}
                />
            ),
        },
        {
            field: "issueCount",
            headerName: labels.issues,
            width: 163,
            sortable: false,
            renderCell: (params) => <MeetingIssueCell row={params.row} />,
        },
        {
            field: "documentName",
            headerName: labels.meetingRequest,
            width: MEETING_REQUEST_COLUMN_WIDTH,
            align: "center",
            headerAlign: "center",
            sortable: false,
            renderCell: (params) => <MeetingDocumentCell row={params.row} />,
        },
        {
            field: "requestedDate",
            headerName: labels.requestedDate,
            width: 147,
            sortable: false,
            renderCell: (params) => (
                <DataTableDateCell
                    value={params.row.requestedDate}
                    showTooltip={false}
                />
            ),
        },
        {
            field: "requestedBy",
            headerName: labels.requestedBy,
            width: 240,
            minWidth: 220,
            sortable: false,
            renderCell: (params) => (
                <MeetingTextCell value={params.row.requestedBy} wrap />
            ),
        },
        {
            field: "action",
            headerName: "Action",
            width: 100,
            minWidth: 100,
            align: "center",
            headerAlign: "center",
            sortable: false,
            filterable: false,
            disableColumnMenu: true,
            renderCell: (params) => (
                <MeetingActionCell
                    row={params.row}
                    onView={actions.onView}
                    onCreateMeeting={actions.onCreateMeeting}
                />
            ),
        },
    ];
}
