"use client";

import * as React from "react";
import { Download, Eye, History, Pencil } from "lucide-react";

import type { OrderBlotterHistory } from "@/app/dashboard/order-blotter/_components/history-types";
import { OrderBlotterHistorySheet } from "@/app/dashboard/order-blotter/_components/order-blotter-history-sheet";
import type { OrderBlotterRow } from "@/app/dashboard/order-blotter/_components/schema";
import { Button } from "@/components/ui/button";
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
import { isRecord } from "@/lib/server-utils";

type OrderBlotterRowActionsProps = {
  row: OrderBlotterRow;
  basePath: string;
};

export function OrderBlotterRowActions({ row, basePath }: OrderBlotterRowActionsProps) {
  const [historyOpen, setHistoryOpen] = React.useState(false);
  const [history, setHistory] = React.useState<OrderBlotterHistory | null>(null);
  const [historyLoading, setHistoryLoading] = React.useState(false);

  const base = `${basePath}/${row.id}`;
  const fromList = "from=list";
  const refPart = row.ref ? `ref=${encodeURIComponent(row.ref)}` : "";
  const viewHref = `${base}?action=view&${fromList}${refPart ? `&${refPart}` : ""}`;
  const updateHref = `${base}?action=update&${fromList}${refPart ? `&${refPart}` : ""}`;

  const downloadQs = new URLSearchParams();
  if (row.id > 0) downloadQs.set("id", String(row.id));
  if (row.ref) downloadQs.set("ref", row.ref);
  const downloadQuery = downloadQs.toString();
  const exportHref = `${basePath}/export${downloadQuery ? `?${downloadQuery}` : ""}`;
  const historyApi = `${basePath}/history${downloadQuery ? `?${downloadQuery}` : ""}`;

  async function openHistory() {
    if (historyLoading) return;
    setHistoryOpen(true);

    if (history) return;

    setHistoryLoading(true);
    try {
      const response = await fetch(historyApi, {
        method: "GET",
        headers: { Accept: "application/json" },
        cache: "no-store",
      });
      const payload = (await response.json().catch(() => null)) as unknown;
      if (!response.ok || !isRecord(payload) || !isRecord(payload.data)) {
        setHistory(null);
        return;
      }
      setHistory(payload.data as OrderBlotterHistory);
    } catch {
      setHistory(null);
    } finally {
      setHistoryLoading(false);
    }
  }

  return (
    <>
      <div className="flex items-center justify-end gap-0.5">
        <Tooltip>
          <TooltipTrigger asChild>
            <Button variant="default" size="icon-sm" className="size-7" asChild>
              <a href={viewHref} aria-label={`View blotter ${row.id}`}>
                <Eye className="size-3.5" />
              </a>
            </Button>
          </TooltipTrigger>
          <TooltipContent>View</TooltipContent>
        </Tooltip>
        <Tooltip>
          <TooltipTrigger asChild>
            <Button variant="secondary" size="icon-sm" className="size-7" asChild>
              <a href={updateHref} aria-label={`Update blotter ${row.id}`}>
                <Pencil className="size-3.5" />
              </a>
            </Button>
          </TooltipTrigger>
          <TooltipContent>Update</TooltipContent>
        </Tooltip>
        <Tooltip>
          <TooltipTrigger asChild>
            <Button
              type="button"
              variant="ghost"
              size="icon-sm"
              className="size-7 text-[#605ca8] hover:bg-[#605ca8]/10 hover:text-[#605ca8]"
              onClick={() => void openHistory()}
              disabled={historyLoading}
              aria-label={`History for blotter ${row.id}`}
            >
              <History className="size-3.5" />
            </Button>
          </TooltipTrigger>
          <TooltipContent>History</TooltipContent>
        </Tooltip>
        <Tooltip>
          <TooltipTrigger asChild>
            <Button
              variant="ghost"
              size="icon-sm"
              className="size-7 text-[#00a65a] hover:bg-[#00a65a]/10 hover:text-[#00a65a]"
              asChild
            >
              <a href={exportHref} aria-label={`Export blotter ${row.id}`}>
                <Download className="size-3.5" />
              </a>
            </Button>
          </TooltipTrigger>
          <TooltipContent>Export CSV</TooltipContent>
        </Tooltip>
      </div>

      <OrderBlotterHistorySheet
        id={row.id}
        history={history}
        open={historyOpen}
        onOpenChange={setHistoryOpen}
      />
    </>
  );
}
