"use client";

import type { ColumnDef } from "@tanstack/react-table";

import { DashboardMasterRowActions } from "@/app/dashboard/_components/dashboard-master-row-actions";
import { MasterReviewStatusCell } from "@/app/dashboard/_components/master-review-status-cell";
import { Input } from "@/components/ui/input";

import { ActiveReviewBadge } from "@/components/shared/status-pill";
import type { MacroAssetClassRow } from "./schema";

const CHANGE_STATUS_HREF = "/dashboard/master/macro-asset-class/change-status";
const DELETE_HREF = "/dashboard/master/macro-asset-class/delete";

type PriorityHandlers = {
  priorities: Record<number, number>;
  onPriorityChange: (id: number, priority: number) => void;
};

function MacroAssetClassActions({ row }: { row: MacroAssetClassRow }) {
  const base = `/dashboard/master/macro-asset-class/${row.id}`;

  return (
    <DashboardMasterRowActions
      editHref={base}
      editAriaLabel="Update macro asset class"
      deleteUrl={DELETE_HREF}
      entityId={row.id}
      entityName={row.masterName}
      entityLabel="macro asset class"
      fallbackError="Macro asset class could not be deleted."
      defaultSuccessMessage="Macro asset class deleted."
    />
  );
}

function MasterNameCell({ row }: { row: MacroAssetClassRow }) {
  const base = `/dashboard/master/macro-asset-class/${row.id}`;

  return (
    <MasterReviewStatusCell
      id={row.id}
      masterName={row.masterName}
      editHref={base}
      status={row.status}
      changeStatusUrl={CHANGE_STATUS_HREF}
      fallbackError="Macro asset class status could not be changed."
      defaultSuccessMessage="Macro asset class status changed"
    />
  );
}

export function createMacroAssetClassColumns({
  priorities,
  onPriorityChange,
}: PriorityHandlers): ColumnDef<MacroAssetClassRow>[] {
  return [
    {
      accessorKey: "masterName",
      header: "Macro asset class name",
      cell: ({ row }) => <MasterNameCell row={row.original} />,
    },
    {
      accessorKey: "modulesLabel",
      header: "Modules",
      enableColumnFilter: false,
      cell: ({ row }) => (
        <p
          className="line-clamp-2 max-w-[320px] overflow-hidden text-ellipsis text-muted-foreground text-xs leading-relaxed"
          title={row.original.modulesLabel}
        >
          {row.original.modulesLabel}
        </p>
      ),
    },
    {
      accessorKey: "status",
      header: "Status",
      cell: ({ row }) => (
        <ActiveReviewBadge
          status={row.original.status}
          label={row.original.statusLabel}
        />
      ),
    },
    {
      id: "priority",
      header: "Priority",
      enableColumnFilter: false,
      cell: ({ row }) => {
        const id = row.original.id;
        const value = priorities[id] ?? row.original.priority;

        return (
          <Input
            type="number"
            min={0}
            className="h-8 w-14 bg-background text-center text-xs tabular-nums"
            value={value}
            onChange={(event) => {
              const parsed = Number(event.target.value);
              onPriorityChange(id, Number.isFinite(parsed) ? parsed : 0);
            }}
          />
        );
      },
    },
    {
      id: "options",
      header: () => <span className="block w-full text-right">Options</span>,
      cell: ({ row }) => <MacroAssetClassActions row={row.original} />,
      enableSorting: false,
    },
  ];
}
