'use client';

import { useState } from 'react';
import { useQuery } from '@tanstack/react-query';

import { ReservationList, type ReservationRow } from '@/components/reservations/reservation-list';
import { Button } from '@/components/ui/button';
import { apiFetch } from '@/lib/api/client';

interface ClientReservationsTabProps {
  clientId: string;
  activeReservations: Array<{
    id: string;
    berthId: string;
    yachtId: string;
    startDate: string | Date;
    tenureType: string;
    status: string;
  }>;
}

interface ReservationListResponse {
  data: ReservationRow[];
  pagination?: { total: number };
}

export function ClientReservationsTab({
  clientId,
  activeReservations,
}: ClientReservationsTabProps) {
  const [showHistory, setShowHistory] = useState(false);

  const activeRows: ReservationRow[] = activeReservations.map((r) => ({
    id: r.id,
    berthId: r.berthId,
    portId: '',
    clientId,
    yachtId: r.yachtId,
    status: r.status as ReservationRow['status'],
    startDate: typeof r.startDate === 'string' ? r.startDate : r.startDate.toISOString(),
    endDate: null,
    tenureType: r.tenureType,
    contractFileId: null,
    notes: null,
    createdAt: '',
  }));

  // Lazy-load history (ended + cancelled). Two parallel queries because
  // the API takes one status at a time; combining once both resolve.
  const endedQuery = useQuery({
    queryKey: ['reservations', { clientId, status: 'ended' }],
    queryFn: () =>
      apiFetch<ReservationListResponse>(
        `/api/v1/berth-reservations?clientId=${encodeURIComponent(clientId)}&status=ended&pageSize=50`,
      ),
    enabled: showHistory,
  });
  const cancelledQuery = useQuery({
    queryKey: ['reservations', { clientId, status: 'cancelled' }],
    queryFn: () =>
      apiFetch<ReservationListResponse>(
        `/api/v1/berth-reservations?clientId=${encodeURIComponent(clientId)}&status=cancelled&pageSize=50`,
      ),
    enabled: showHistory,
  });

  const historyRows: ReservationRow[] = [
    ...(endedQuery.data?.data ?? []),
    ...(cancelledQuery.data?.data ?? []),
  ].sort((a, b) => (a.startDate < b.startDate ? 1 : -1));

  const isHistoryLoading = showHistory && (endedQuery.isLoading || cancelledQuery.isLoading);

  return (
    <div className="space-y-6">
      <div>
        <div className="flex items-center justify-between">
          <h3 className="text-sm font-medium">Active reservations</h3>
        </div>
        <ReservationList
          reservations={activeRows}
          showBerth
          emptyMessage="This client has no active reservations."
        />
      </div>

      <div>
        <div className="flex items-center justify-between mb-2">
          <h3 className="text-sm font-medium">History</h3>
          <Button
            size="sm"
            variant="outline"
            onClick={() => setShowHistory((v) => !v)}
            disabled={isHistoryLoading}
          >
            {showHistory ? 'Hide history' : 'Show history'}
          </Button>
        </div>
        {showHistory ? (
          isHistoryLoading ? (
            <p className="text-xs text-muted-foreground">Loading…</p>
          ) : (
            <ReservationList
              reservations={historyRows}
              showBerth
              emptyMessage="No ended or cancelled reservations."
            />
          )
        ) : (
          <p className="text-xs text-muted-foreground">
            Click &ldquo;Show history&rdquo; to load ended and cancelled reservations.
          </p>
        )}
      </div>
    </div>
  );
}
