import type { GridColDef } from "@mui/x-data-grid";

import { DataTableNumberCell } from "@/components/ui/data-table";

import {
  UserActionCell,
  UserLogDeviceCell,
  UserNameCell,
  UserStatusBadgeCell,
  UserTextCell,
} from "@/features/admin/user-management/components/table/user-table-cells";
import type { UserRow } from "@/features/admin/user-management/hook/use-user-management";
import type { AdminUserStatus } from "@/features/admin/user-management/service/user-management-service";

export type UserTableLabels = {
  columns: {
    id: string;
    user: string;
    email: string;
    position: string;
    status: string;
    logDevice: string;
  };
  noDevice: string;
  statuses: Record<AdminUserStatus, string>;
  actions: {
    editUser: string;
    deleteUser: string;
    loginTrails: string;
    activate: string;
    deactivate: string;
  };
};

type UserTableHandlers = {
  labels: UserTableLabels;
  isProtectedUser: (user: UserRow) => boolean;
  onEdit: (user: UserRow) => void;
  onOpenLoginTrails: (user: UserRow) => void;
  onToggleStatus: (user: UserRow) => void;
  onDelete: (user: UserRow) => void;
};

export function getUserTableColumns({
  labels,
  isProtectedUser,
  onEdit,
  onOpenLoginTrails,
  onToggleStatus,
  onDelete,
}: UserTableHandlers): GridColDef<UserRow>[] {
  return [
    {
      field: "id",
      headerName: labels.columns.id,
      minWidth: 80,
      flex: 0.4,
      align: "center",
      // IDs are stored as strings, so compare as numbers to sort 1, 2, 10 correctly.
      sortComparator: (a, b) => Number(a) - Number(b),
      renderCell: (params) => (
        <DataTableNumberCell value={params.row.id} />
      ),
    },
    {
      field: "name",
      headerName: labels.columns.user,
      minWidth: 280,
      flex: 1.2,
      renderCell: (params) => <UserNameCell user={params.row} />,
    },
    {
      field: "email",
      headerName: labels.columns.email,
      minWidth: 240,
      flex: 1,
      renderCell: (params) => <UserTextCell value={params.row.email || "-"} />,
    },
    {
      field: "position",
      headerName: labels.columns.position,
      minWidth: 220,
      flex: 1,
      align: "center",
      renderCell: (params) => (
        <UserTextCell
          align="center"
          value={String(params.row.position || "-")}
        />
      ),
    },
    {
      field: "status",
      headerName: labels.columns.status,
      minWidth: 150,
      flex: 0.7,
      align: "center",
      renderCell: (params) => (
        <UserStatusBadgeCell
          status={params.row.status}
          label={labels.statuses[params.row.status]}
        />
      ),
    },
    {
      field: "logDevice",
      headerName: labels.columns.logDevice,
      minWidth: 240,
      flex: 1,
      align: "center",
      sortable: false,
      filterable: false,
      renderCell: (params) => (
        <UserLogDeviceCell
          align="center"
          deviceName={params.row.lastLoginDevice || labels.noDevice}
          activityDate={params.row.lastLoginAt}
          ipAddress={params.row.lastLoginIp}
          deviceType={params.row.lastLoginDeviceType}
        />
      ),
    },
    {
      field: "actions",
      headerName: "",
      width: 64,
      align: "center",
      sortable: false,
      filterable: false,
      renderCell: (params) => (
        <UserActionCell
          user={params.row}
          labels={labels.actions}
          isProtected={isProtectedUser(params.row)}
          onEdit={onEdit}
          onOpenLoginTrails={onOpenLoginTrails}
          onToggleStatus={onToggleStatus}
          onDelete={onDelete}
        />
      ),
    },
  ];
}
