"use client";

import {useState, useTransition} from "react";
import {useRouter} from "next/navigation";
import {Button} from "@/components/ui/button";
import {Card, CardContent, CardHeader, CardTitle} from "@/components/ui/card";
import {Check, X, Truck, RotateCcw, Clock} from "lucide-react";
import {confirmBooking, cancelBooking, pickupVehicle, returnVehicle, extendBooking} from "@/features/bookings/server/actions";

type BookingStatusActionsProps = {
  bookingId: string;
  currentStatus: string;
  tenantSlug: string;
};

export function BookingStatusActions({bookingId, currentStatus, tenantSlug}: BookingStatusActionsProps) {
  const router = useRouter();
  const [isPending, startTransition] = useTransition();
  const [error, setError] = useState<string | null>(null);
  const [success, setSuccess] = useState<string | null>(null);

  async function handleConfirm() {
    setError(null);
    setSuccess(null);
    const result = await confirmBooking(bookingId, tenantSlug);
    if (result.success) {
      setSuccess("Booking confirmed and invoice created.");
      startTransition(() => router.refresh());
    } else {
      setError(result.error ?? "Failed to confirm booking");
    }
  }

  async function handleCancel() {
    setError(null);
    setSuccess(null);
    const reason = window.prompt("Reason for cancellation (optional):");
    const result = await cancelBooking(bookingId, tenantSlug, reason ?? undefined);
    if (result.success) {
      setSuccess("Booking cancelled.");
      startTransition(() => router.refresh());
    } else {
      setError(result.error ?? "Failed to cancel booking");
    }
  }

  async function handlePickup() {
    setError(null);
    setSuccess(null);
    const result = await pickupVehicle(bookingId, tenantSlug);
    if (result.success) {
      setSuccess("Vehicle marked as picked up. Rental is now active.");
      startTransition(() => router.refresh());
    } else {
      setError(result.error ?? "Failed to process pickup");
    }
  }

  async function handleReturn() {
    setError(null);
    setSuccess(null);
    const extraInput = window.prompt("Additional charges (enter 0 if none):", "0");
    const additionalFees = parseFloat(extraInput ?? "0") || 0;
    const result = await returnVehicle(bookingId, tenantSlug, additionalFees);
    if (result.success) {
      setSuccess("Vehicle returned. Booking completed.");
      startTransition(() => router.refresh());
    } else {
      setError(result.error ?? "Failed to process return");
    }
  }

  async function handleExtend() {
    setError(null);
    setSuccess(null);
    const newDate = window.prompt("New return date (YYYY-MM-DDTHH:mm):");
    if (!newDate) return;
    const formData = new FormData();
    formData.set("bookingId", bookingId);
    formData.set("tenantSlug", tenantSlug);
    formData.set("newDropoffAt", newDate);
    const result = await extendBooking(formData);
    if (result.success) {
      setSuccess("Booking extended successfully.");
      startTransition(() => router.refresh());
    } else {
      setError(result.error ?? "Failed to extend booking");
    }
  }

  const showConfirm = ["PENDING_APPROVAL", "PENDING_PAYMENT"].includes(currentStatus);
  const showPickup = currentStatus === "CONFIRMED";
  const showReturn = currentStatus === "ACTIVE";
  const showExtend = ["CONFIRMED", "ACTIVE"].includes(currentStatus);
  const showCancel = ["PENDING_APPROVAL", "PENDING_PAYMENT", "CONFIRMED"].includes(currentStatus);

  if (!showConfirm && !showPickup && !showReturn && !showCancel && !showExtend) return null;

  return (
    <Card>
      <CardHeader><CardTitle>Actions</CardTitle></CardHeader>
      <CardContent>
        <div className="flex flex-wrap gap-3">
          {showConfirm && (
            <Button onClick={handleConfirm} disabled={isPending} className="bg-green-600 hover:bg-green-700">
              <Check className="mr-2 h-4 w-4" />
              Confirm Booking
            </Button>
          )}
          {showPickup && (
            <Button onClick={handlePickup} disabled={isPending} className="bg-blue-600 hover:bg-blue-700">
              <Truck className="mr-2 h-4 w-4" />
              Mark as Picked Up
            </Button>
          )}
          {showReturn && (
            <Button onClick={handleReturn} disabled={isPending}>
              <RotateCcw className="mr-2 h-4 w-4" />
              Process Return
            </Button>
          )}
          {showExtend && (
            <Button onClick={handleExtend} disabled={isPending} variant="outline">
              <Clock className="mr-2 h-4 w-4" />
              Extend Booking
            </Button>
          )}
          {showCancel && (
            <Button onClick={handleCancel} disabled={isPending} variant="outline" className="border-red-300 text-red-600 hover:bg-red-50">
              <X className="mr-2 h-4 w-4" />
              Cancel Booking
            </Button>
          )}
        </div>
        {success && <p className="mt-3 rounded-lg bg-green-50 border border-green-200 px-3 py-2 text-sm text-green-700">{success}</p>}
        {error && <p className="mt-3 rounded-lg bg-red-50 border border-red-200 px-3 py-2 text-sm text-red-600">{error}</p>}
      </CardContent>
    </Card>
  );
}
