// src/features/admin-group-deals/GroupDealOversight.tsx
// Admin: group deal oversight — list active + terminal group deals.
// Actions: force-tip (execute immediately) + cancel (fail + release reservations).

'use client';

import { useState } from 'react';
import * as Sentry from '@sentry/astro';
import { usePaginatedQuery } from '@/lib/hooks/usePaginatedQuery';
import { useT, useLocale } from '@/lib/i18n/react';
import { formatDate } from '@/lib/format';
import { getCsrfToken } from '@/lib/csrf';
import { Button } from '@/components/ui/primitives/Button';
import {
  AlertDialog,
  AlertDialogContent,
  AlertDialogHeader,
  AlertDialogTitle,
  AlertDialogDescription,
  AlertDialogFooter,
  AlertDialogAction,
  AlertDialogCancel,
} from '@/components/ui/overlays/AlertDialog';
import { AdminListPage } from '@/components/ui/domain/admin/AdminListPage';
import { AdminTable, type ColumnDef } from '@/components/ui/domain/admin/AdminTable';
import { Pagination } from '@/components/ui/primitives/Pagination';
import { ErrorBoundary } from '@/components/ui/feedback/ErrorBoundary';
import { InlineNotice } from '@/components/ui/feedback/InlineNotice';
import {
  Tooltip,
  TooltipContent,
  TooltipProvider,
  TooltipTrigger,
} from '@/components/ui/overlays/Tooltip/Tooltip';

// ─── Types ────────────────────────────────────────────────────────────────────

export interface GroupDealRow {
  id: string;
  groupDealId: string;
  dealId: string;
  dealTitle: string;
  vendorId: string;
  vendorBusinessName: string;
  groupState: string;
  currentReservationCount: number;
  minGroupSize: number;
  maxGroupSize: number;
  windowEnd: string | null;
  createdAt: string;
}

export interface GroupDealOversightProps {
  initialRows: GroupDealRow[];
  initialTotal: number;
  initialPage?: number;
}

// ─── Component ────────────────────────────────────────────────────────────────

export function GroupDealOversight({
  initialRows,
  initialTotal,
  initialPage,
}: GroupDealOversightProps) {
  const t = useT('admin_group_deals');
  const tCommon = useT('common');
  const { locale } = useLocale();
  const [actionPending, setActionPending] = useState<string | null>(null);
  const [actionError, setActionError] = useState<string | null>(null);
  const [confirmAction, setConfirmAction] = useState<{
    groupDealId: string;
    action: 'force-tip' | 'cancel';
  } | null>(null);

  const { data, totalPages, page, isLoading, error, setPage, refetch } =
    usePaginatedQuery<GroupDealRow>({
      endpoint: '/api/admin/group-deals',
      params: {},
      limit: 20,
      initialData: initialRows,
      initialTotal,
      initialPage,
      dataKey: 'groupDeals',
    });

  async function callAction(groupDealId: string, action: 'force-tip' | 'cancel') {
    setActionPending(groupDealId + ':' + action);
    setActionError(null);
    try {
      const res = await fetch(`/api/admin/group-deals/${groupDealId}/${action}`, {
        method: 'POST',
        headers: { 'x-csrf-token': getCsrfToken() },
      });
      const json = (await res.json()) as { ok: boolean; error?: string };
      if (!json.ok) {
        setActionError(
          json.error ?? (action === 'force-tip' ? t('force_tip_error') : t('cancel_error')),
        );
      } else {
        refetch();
      }
    } catch (err) {
      Sentry.captureException(err);
      console.error('[GroupDealOversight] action error:', err);
      setActionError(action === 'force-tip' ? t('force_tip_error') : t('cancel_error'));
    } finally {
      setActionPending(null);
    }
  }

  function handleForceTip(groupDealId: string) {
    setConfirmAction({ groupDealId, action: 'force-tip' });
  }

  function handleCancel(groupDealId: string) {
    setConfirmAction({ groupDealId, action: 'cancel' });
  }

  // Deliberate subset: only terminal states where admin actions (cancel/extend) are blocked.
  const terminalStates = ['SUCCEEDED', 'FAILED', 'VENDOR_HONORED'];

  const columns: ColumnDef<GroupDealRow>[] = [
    {
      key: 'dealTitle',
      label: t('col_deal'),
      render: (row) => <span data-user-displayname>{row.dealTitle}</span>,
    },
    {
      key: 'vendorBusinessName',
      label: t('col_vendor'),
      render: (row) => <span data-user-displayname>{row.vendorBusinessName}</span>,
    },
    {
      key: 'groupState',
      label: t('col_state'),
      align: 'center',
      render: (row) => t(`state_${row.groupState}` as Parameters<typeof t>[0]),
    },
    {
      key: 'currentReservationCount',
      label: t('col_reservations'),
      headerTooltip: t('col_reservations_tooltip'),
      align: 'center',
      render: (row) => `${row.currentReservationCount} / ${row.minGroupSize}–${row.maxGroupSize}`,
    },
    {
      key: 'windowEnd',
      label: t('col_deadline'),
      headerTooltip: t('col_deadline_tooltip'),
      align: 'center',
      render: (row) => (row.windowEnd ? formatDate(row.windowEnd, locale) : '—'),
    },
    {
      key: 'groupDealId',
      label: t('col_actions'),
      align: 'center',
      render: (row) => {
        const isTerminal = terminalStates.includes(row.groupState);
        if (isTerminal) return null;
        const forcePending = actionPending === row.groupDealId + ':force-tip';
        const cancelPending = actionPending === row.groupDealId + ':cancel';
        return (
          <span className="flex justify-center gap-2">
            <Tooltip>
              <TooltipTrigger asChild>
                <Button
                  variant="secondary"
                  size="sm"
                  disabled={forcePending || cancelPending}
                  onClick={() => handleForceTip(row.groupDealId)}
                >
                  {forcePending ? '…' : t('action_force_tip')}
                </Button>
              </TooltipTrigger>
              <TooltipContent side="top" className="max-w-xs text-xs">
                {t('action_force_tip_tooltip')}
              </TooltipContent>
            </Tooltip>
            <Tooltip>
              <TooltipTrigger asChild>
                <Button
                  variant="danger"
                  size="sm"
                  disabled={forcePending || cancelPending}
                  onClick={() => handleCancel(row.groupDealId)}
                >
                  {cancelPending ? '…' : t('action_cancel')}
                </Button>
              </TooltipTrigger>
              <TooltipContent side="top" className="max-w-xs text-xs">
                {t('action_cancel_tooltip')}
              </TooltipContent>
            </Tooltip>
          </span>
        );
      },
    },
  ];

  return (
    <ErrorBoundary>
      <TooltipProvider delayDuration={150}>
        {actionError && <InlineNotice tone="danger" description={actionError} className="mb-4" />}
        <AdminListPage
          subtitle={t('page_subtitle')}
          status={error ? 'error' : isLoading ? 'loading' : 'idle'}
          onRetry={() => setPage(page)}
          table={<AdminTable<GroupDealRow> columns={columns} rows={data} />}
          pagination={<Pagination page={page} totalPages={totalPages} onPageChange={setPage} />}
        />

        <AlertDialog
          open={!!confirmAction}
          onOpenChange={(open) => {
            if (!open) setConfirmAction(null);
          }}
        >
          <AlertDialogContent>
            <AlertDialogHeader>
              <AlertDialogTitle>
                {confirmAction?.action === 'force-tip' ? t('action_force_tip') : t('action_cancel')}
              </AlertDialogTitle>
              <AlertDialogDescription>
                {confirmAction?.action === 'force-tip'
                  ? t('force_tip_confirm')
                  : t('cancel_confirm')}
              </AlertDialogDescription>
            </AlertDialogHeader>
            <AlertDialogFooter>
              <AlertDialogCancel>{tCommon('cancel')}</AlertDialogCancel>
              <AlertDialogAction
                onClick={() => {
                  if (confirmAction) {
                    void callAction(confirmAction.groupDealId, confirmAction.action);
                    setConfirmAction(null);
                  }
                }}
              >
                {confirmAction?.action === 'force-tip' ? t('action_force_tip') : t('action_cancel')}
              </AlertDialogAction>
            </AlertDialogFooter>
          </AlertDialogContent>
        </AlertDialog>
      </TooltipProvider>
    </ErrorBoundary>
  );
}
