'use client'
import { useState, useEffect, useCallback } from 'react';
import { useRouter, useSearchParams } from 'next/navigation';
import { toast } from "sonner";
import { OrderEdit, OrderDetail, OrderManagement } from '@/backend/route-params';
import { getOrderForEdit, updateOrder } from '@/backend/actions/OrderEdit';
import type { DeliveryOrderStatus, OrderEditDetail } from '@/backend/actions/OrderEdit';

// ===== 类型定义 =====
interface FormFields {
  customer_name: string;
  customer_phone: string;
  governorate_name: string;
  area_name: string;
  nearest_landmark: string;
  driver_name: string;
  order_type: string;
  total_amount: string;
}

// Export States
export interface OrderEditState {
  /** 页面是否正在加载数据 */
  isLoading: boolean;
  /** 是否正在保存提交 */
  isSaving: boolean;
  /** 订单基础信息 */
  orderHeader: OrderEditDetail | null;
  /** 表单数据 */
  formData: FormFields;
  /** 订单 ID */
  id: string | undefined;
  /** 状态标签映射 */
  STATUS_LABELS: Record<DeliveryOrderStatus, string>;
}

// Export Handlers
export interface OrderEditHandlers {
  /** 表单字段变更回调 */
  handleFormChange: <K extends keyof FormFields>(field: K, value: FormFields[K]) => void;
  /** 保存订单修改 */
  handleSave: () => Promise<void>;
  /** 取消并返回详情页或列表 */
  handleCancel: () => void;
}

export const useOrderEdit = (): { state: OrderEditState, handlers: OrderEditHandlers } => {
  const router = useRouter();
  const searchParams = useSearchParams();
  const { id } = OrderEdit.getParams(searchParams);

  // ===== Constants =====
  const STATUS_LABELS: Record<DeliveryOrderStatus, string> = {
    PENDING: 'قيد الانتظار',
    IN_PROGRESS: 'قيد التوصيل',
    DELIVERED: 'تم التوصيل',
    CANCELLED: 'ملغي',
  };

  // ===== State =====
  const [isLoading, setIsLoading] = useState(true);
  const [isSaving, setIsSaving] = useState(false);
  const [orderHeader, setOrderHeader] = useState<OrderEditDetail | null>(null);
  
  const [formData, setFormData] = useState<FormFields>({
    customer_name: '',
    customer_phone: '',
    governorate_name: '',
    area_name: '',
    nearest_landmark: '',
    driver_name: '',
    order_type: '',
    total_amount: '',
  });

  // ===== Effects =====
  useEffect(() => {
    if (!id) {
      OrderManagement.navigateToDefault(router);
      return;
    }

    let isMounted = true;
    const fetchOrderData = async () => {
      try {
        setIsLoading(true);
        const { order } = await getOrderForEdit({ order_id: id });
        
        if (!isMounted) return;

        if (order) {
          setOrderHeader(order);
          setFormData({
            customer_name: order.customer_name,
            customer_phone: order.customer_phone,
            governorate_name: order.governorate_name,
            area_name: order.area_name,
            nearest_landmark: order.nearest_landmark,
            driver_name: order.driver_name,
            order_type: order.order_type,
            total_amount: order.total_amount,
          });
        }
      } catch (error) {
        if (error instanceof Error) {
          toast.error(error.message);
        }
      } finally {
        if (isMounted) {
          setIsLoading(false);
        }
      }
    };

    fetchOrderData();

    return () => {
      isMounted = false;
    };
  }, [id, router]);

  // ===== Handlers =====
  const handleFormChange = useCallback(<K extends keyof FormFields>(field: K, value: FormFields[K]) => {
    setFormData((prev) => ({
      ...prev,
      [field]: value
    }));
  }, []);

  const handleSave = async () => {
    if (
      !formData.customer_name.trim() ||
      !formData.customer_phone.trim() ||
      !formData.governorate_name.trim() ||
      !formData.area_name.trim() ||
      !formData.nearest_landmark.trim() ||
      !formData.driver_name.trim() ||
      !formData.order_type.trim() ||
      !formData.total_amount.trim()
    ) {
      toast.error('يرجى تعبئة جميع الحقول المطلوبة');
      return;
    }

    if (!/^\d+$/.test(formData.customer_phone.trim())) {
      toast.error('يجب أن يحتوي رقم الهاتف على أرقام فقط');
      return;
    }

    if (!/^\d+(\.\d{1,2})?$/.test(formData.total_amount.trim())) {
      toast.error('يجب إدخال المبلغ الكلي بصيغة رقمية صحيحة');
      return;
    }

    try {
      setIsSaving(true);
      await updateOrder({
        order_id: id!,
        ...formData
      });
      toast.success('تم تعديل الطلب بنجاح');
      OrderDetail.navigateToDetail(router, { orderId: id! });
    } catch (error) {
      if (error instanceof Error) {
        toast.error(error.message);
      }
    } finally {
      setIsSaving(false);
    }
  };

  const handleCancel = useCallback(() => {
    if (id) {
      OrderDetail.navigateToDetail(router, { orderId: id });
    } else {
      OrderManagement.navigateToDefault(router);
    }
  }, [id, router]);

  return {
    state: {
      isLoading,
      isSaving,
      orderHeader,
      formData,
      id,
      STATUS_LABELS,
    },
    handlers: {
      handleFormChange,
      handleSave,
      handleCancel,
    }
  };
};