"use client";

import * as React from "react";
import type { ColumnDef } from "@tanstack/react-table";
import Link from "next/link";

import { DashboardMasterRowActions } from "@/app/dashboard/_components/dashboard-master-row-actions";
import { ActiveInactiveBadge } from "@/components/shared/status-pill";
import { FRONTEND_ROUTES } from "@/config/frontend-routes";
import { cn } from "@/lib/utils";

import type { PromoCodeRow, PromoType } from "./schema";

const typeAccent: Record<PromoType, string> = {
  percentage: "bg-violet-100 text-violet-800",
  "fixed amount": "bg-sky-100 text-sky-800",
};

type PromoColumnsOptions = {
  onDeleted?: () => void;
};

function PromoActions({
  row,
  onDeleted,
}: {
  row: PromoCodeRow;
  onDeleted?: () => void;
}) {
  const base = `/dashboard/plans-orders/promo-codes/${row.id}`;

  return (
    <DashboardMasterRowActions
      editHref={base}
      editAriaLabel="Update promo code"
      deleteUrl={FRONTEND_ROUTES.plansOrders.promoCodes.deleteSubmit}
      entityId={row.id}
      entityName={row.code}
      entityLabel="promo code"
      fallbackError="Promo code could not be deleted."
      defaultSuccessMessage="Promo code deleted."
      onDeleted={onDeleted}
    />
  );
}

export function createPromoColumns({ onDeleted }: PromoColumnsOptions = {}): ColumnDef<PromoCodeRow>[] {
  return [
    {
      accessorKey: "code",
      header: "Code",
      cell: ({ row }) => (
        <Link
          href={`/dashboard/plans-orders/promo-codes/${row.original.id}`}
          className="font-mono font-semibold text-primary text-sm hover:underline"
        >
          {row.original.code}
        </Link>
      ),
    },
    {
      accessorKey: "type",
      header: "Type",
      cell: ({ row }) => (
        <span
          className={cn(
            "inline-flex rounded-full px-2 py-0.5 font-medium text-[11px] capitalize",
            typeAccent[row.original.type],
          )}
        >
          {row.original.typeLabel}
        </span>
      ),
    },
    {
      accessorKey: "discount",
      header: "Discount",
      cell: ({ row }) => (
        <span className="font-semibold tabular-nums text-sm">{row.original.discountFormatted}</span>
      ),
    },
    {
      accessorKey: "totalAmount",
      header: "Total amount",
      cell: ({ row }) => (
        <span className="tabular-nums text-sm">
          {row.original.totalAmount > 0 ? row.original.totalAmountFormatted : "—"}
        </span>
      ),
    },
    {
      accessorKey: "totalUsage",
      header: "Total usage",
      cell: ({ row }) => (
        <span className="tabular-nums text-sm">
          {row.original.totalUsage === 0 ? (
            <span className="text-muted-foreground">Unlimited</span>
          ) : (
            row.original.totalUsage
          )}
        </span>
      ),
    },
    {
      accessorKey: "customerUsage",
      header: "Customer usage",
      cell: ({ row }) => (
        <span className="tabular-nums text-sm">
          {row.original.customerUsage === 0 ? (
            <span className="text-muted-foreground">Unlimited</span>
          ) : (
            row.original.customerUsage
          )}
        </span>
      ),
    },
    {
      accessorKey: "status",
      header: "Status",
      cell: ({ row }) => (
        <ActiveInactiveBadge status={row.original.status} label={row.original.statusLabel} />
      ),
    },
    {
      accessorKey: "dateStart",
      header: "Date start",
      cell: ({ row }) => (
        <span className="text-muted-foreground text-sm whitespace-nowrap">{row.original.dateStart}</span>
      ),
    },
    {
      accessorKey: "dateEnd",
      header: "Date end",
      cell: ({ row }) => (
        <span className="text-muted-foreground text-sm whitespace-nowrap">{row.original.dateEnd}</span>
      ),
    },
    {
      id: "options",
      header: () => <span className="block w-full text-right">Options</span>,
      cell: ({ row }) => <PromoActions row={row.original} onDeleted={onDeleted} />,
      enableSorting: false,
    },
  ];
}
