"use client";

import React, { useEffect, useMemo, useCallback } from "react";
import {
  EntityFormWrapper,
  ServerActionForm,
  FormActions,
  SelectField,
  useServerActionForm,
  TextField,
} from "../../dashboard/entity-detail/shared";
import {
  FormField,
  FormItem,
  FormLabel,
  FormControl,
  FormMessage,
} from "@/components/ui/form";
import { OrderReferenceField } from "@/components/dashboard/OrderReferenceField";
import { useAction } from "@/hooks/useAction";
import {
  createShipment,
  updateShipment,
  deleteShipment,
} from "@/actions/orders";
import * as z from "zod";
import { toast } from "sonner";

const shipmentSchema = z.object({
  order_id: z.string().uuid().nullable().optional().or(z.literal("")),
  tracking_number: z.string().max(255).nullable().optional(),
  carrier: z.string().max(255).nullable().optional(),
  shipment_type: z.enum(["Original", "Return", "Replacement"]),
  status: z.string().max(100),
});

interface ShipmentFormProps {
  initialData?: any;
  onDataChange?: () => void;
  onCancel?: () => void;
  onSave?: () => void;
}

export function ShipmentForm({
  initialData,
  onDataChange,
  onCancel,
  onSave,
}: ShipmentFormProps) {
  const { execute: executeDelete, isLoading: isDeleting } =
    useAction(deleteShipment);

  const getMappedValues = useCallback(
    (data: any) => ({
      order_id: data?.orderId || data?.order_id || "",
      tracking_number: data?.trackingNumber || data?.tracking_number || "",
      carrier: data?.carrier || "",
      shipment_type: data?.shipmentType || data?.shipment_type || "Original",
      status: data?.status || "pending",
    }),
    [],
  );

  const mappedValues = useMemo(
    () => getMappedValues(initialData),
    [initialData, getMappedValues],
  );

  const { form, onSubmit, isPending, handleSubmit, reset } =
    useServerActionForm({
      schema: shipmentSchema,
      defaultValues: mappedValues,
      serverAction: async (values) => {
        if (initialData?.id) {
          return await updateShipment({
            id: initialData.id,
            data: {
              order_id: values.order_id || null,
              tracking_number: values.tracking_number,
              carrier: values.carrier,
              shipment_type: values.shipment_type,
              status: values.status,
            },
          });
        } else {
          return await createShipment({
            orderId: values.order_id || null,
            trackingNumber: values.tracking_number,
            carrier: values.carrier,
            shipmentType: values.shipment_type,
            status: values.status,
          });
        }
      },
      onSuccess: () => {
        toast.success(
          initialData?.id ? "Sendung aktualisiert" : "Sendung erstellt",
        );
        onSave?.();
        onDataChange?.();
      },
    });

  useEffect(() => {
    reset(mappedValues);
  }, [mappedValues, reset]);

  const handleDelete = async () => {
    if (!initialData?.id) return;
    if (confirm("Sendung wirklich löschen?")) {
      const res = await executeDelete({ id: initialData.id });
      if (res?.success) {
        toast.success("Sendung gelöscht");
        onSave?.();
        onDataChange?.();
      }
    }
  };

  return (
    <EntityFormWrapper
      title={initialData?.id ? "Sendung bearbeiten" : "Neue Sendung"}
      description={
        initialData?.id
          ? "Aktualisieren Sie die Sendungsdaten."
          : "Erstellen Sie eine neue Sendungsverfolgung."
      }
    >
      <ServerActionForm
        form={form}
        isPending={isPending || isDeleting}
        onSubmit={onSubmit}
        handleSubmit={handleSubmit}
      >
        <div className="grid grid-cols-1 gap-4">
          <FormField
            control={form.control}
            name="order_id"
            render={({ field }) => (
              <FormItem>
                <FormLabel>Bestell-ID (Optional)</FormLabel>
                <FormControl>
                  <OrderReferenceField
                    value={field.value || ""}
                    onChange={field.onChange}
                    placeholder="Bestellung suchen..."
                  />
                </FormControl>
                <FormMessage />
              </FormItem>
            )}
          />
          <TextField
            form={form}
            name="tracking_number"
            label="Tracking-Nummer"
            placeholder="z.B. 1Z999..."
          />
          <TextField
            form={form}
            name="carrier"
            label="Versanddienstleister"
            placeholder="z.B. DHL"
          />
          <SelectField
            form={form}
            name="shipment_type"
            label="Typ"
            options={[
              { label: "Original", value: "Original" },
              { label: "Retoure", value: "Return" },
              { label: "Ersatz", value: "Replacement" },
            ]}
          />
          <TextField
            form={form}
            name="status"
            label="Status"
            placeholder="z.B. in-transit"
          />
        </div>

        <FormActions
          isPending={isPending}
          onCancel={onCancel}
          submitLabel={initialData?.id ? "Aktualisieren" : "Erstellen"}
          showDelete={!!initialData?.id}
          onDelete={handleDelete}
        />
      </ServerActionForm>
    </EntityFormWrapper>
  );
}
