'use client'

import { useState, useCallback } from 'react';
import { useSearchParams } from 'next/navigation';
import { OrderCreate } from '@/frontend/route-params';
import type { CreateDeliveryOrderInput } from '@/frontend/actions/OrderCreate';
import { createDeliveryOrder, verifyOrderAccessCode } from '@/frontend/actions/OrderCreate';

// Inner Function（不导出的内部辅助函数）
function getParams(sp: URLSearchParams) {
  return OrderCreate.getParams(sp);
}

const initialFormState: CreateDeliveryOrderInput = {
  governorate_name: '',
  area_name: '',
  nearest_landmark: '',
  customer_name: '',
  customer_phone: '',
  driver_name: '',
  order_type: '',
  total_amount: '',
};

type FormErrors = Partial<Record<keyof CreateDeliveryOrderInput, string>>;

// Export States
export interface OrderCreateState {
  /** 表单数据 */
  formData: CreateDeliveryOrderInput;
  /** 校验错误信息 */
  errors: FormErrors;
  /** 是否正在提交 */
  isSubmitting: boolean;
  /** 提交状态 */
  submitStatus: 'idle' | 'success' | 'error';
  /** 系统反馈消息 */
  submitMessage: string;
  /** هل تم فتح البوابة بنجاح */
  isGateUnlocked: boolean;
  /** اسم مستخدم الدخول */
  accessUsername: string;
  /** رمز الدخول */
  accessCode: string;
  /** خطأ رمز الدخول */
  accessCodeError: string;
}

// Export Handlers
export interface OrderCreateHandlers {
  /** 处理表单字段变更 */
  handleFormFieldChange: <K extends keyof CreateDeliveryOrderInput>(field: K, value: CreateDeliveryOrderInput[K]) => void;
  /** تحديث اسم مستخدم الدخول */
  handleAccessUsernameChange: (value: string) => void;
  /** تحديث رمز الدخول */
  handleAccessCodeChange: (value: string) => void;
  /** فتح البوابة */
  handleUnlockGate: (e: React.FormEvent) => Promise<void>;
  /** 处理表单提交 */
  handleSubmit: (e: React.FormEvent) => Promise<void>;
}

export function useOrderCreate(): {
  state: OrderCreateState;
  handlers: OrderCreateHandlers;
} {
  const searchParams = useSearchParams();
  // 确保按规则调用 getParams
  getParams(searchParams);

  // ===== State =====
  const [formData, setFormData] = useState<CreateDeliveryOrderInput>(initialFormState);
  const [errors, setErrors] = useState<FormErrors>({});
  const [isSubmitting, setIsSubmitting] = useState(false);
  const [submitStatus, setSubmitStatus] = useState<'idle' | 'success' | 'error'>('idle');
  const [submitMessage, setSubmitMessage] = useState<string>('');
  const [isGateUnlocked, setIsGateUnlocked] = useState(false);
  const [accessUsername, setAccessUsername] = useState('');
  const [accessCode, setAccessCode] = useState('');
  const [accessCodeError, setAccessCodeError] = useState('');

  // ===== Validation Logic =====
  const validateForm = (): boolean => {
    const newErrors: FormErrors = {};
    
    if (!formData.governorate_name.trim()) newErrors.governorate_name = 'مطلوب إدخال اسم المحافظة';
    if (!formData.area_name.trim()) newErrors.area_name = 'مطلوب إدخال المنطقة';
    if (!formData.nearest_landmark.trim()) newErrors.nearest_landmark = 'مطلوب إدخال أقرب نقطة دالة';
    if (!formData.customer_name.trim()) newErrors.customer_name = 'مطلوب إدخال اسم الزبون';
    
    if (!formData.customer_phone.trim()) {
      newErrors.customer_phone = 'مطلوب إدخال رقم الزبون';
    } else {
      const cleanedPhone = formData.customer_phone.replace(/[\s\-\(\)\+]/g, '');
      const phoneRegex = /^[0-9]+$/;
      if (!phoneRegex.test(cleanedPhone)) {
        newErrors.customer_phone = 'يرجى إدخال أرقام فقط';
      }
    }

    if (!formData.driver_name.trim()) newErrors.driver_name = 'مطلوب إدخال اسم السائق';
    if (!formData.order_type.trim()) newErrors.order_type = 'مطلوب إدخال نوع الطلب';

    if (!formData.total_amount.trim()) {
      newErrors.total_amount = 'مطلوب إدخال المبلغ الكلي';
    } else {
      const normalizedAmount = Number(formData.total_amount);
      if (!Number.isFinite(normalizedAmount) || normalizedAmount <= 0) {
        newErrors.total_amount = 'يرجى إدخال مبلغ رقمي صحيح أكبر من صفر';
      }
    }

    setErrors(newErrors);
    return Object.keys(newErrors).length === 0;
  };

  // ===== Handlers =====
  const handleFormFieldChange = useCallback(<K extends keyof CreateDeliveryOrderInput>(field: K, value: CreateDeliveryOrderInput[K]) => {
    setFormData(prev => ({ ...prev, [field]: value }));
    setErrors(prev => {
      if (prev[field]) {
        const newErrors = { ...prev };
        delete newErrors[field];
        return newErrors;
      }
      return prev;
    });
  }, []);

  const handleAccessUsernameChange = useCallback((value: string) => {
    setAccessUsername(value);
    if (accessCodeError) {
      setAccessCodeError('');
    }
  }, [accessCodeError]);

  const handleAccessCodeChange = useCallback((value: string) => {
    const normalizedValue = value.replace(/\D/g, '').slice(0, 4);
    setAccessCode(normalizedValue);
    if (accessCodeError) {
      setAccessCodeError('');
    }
  }, [accessCodeError]);

  const handleUnlockGate = async (e: React.FormEvent) => {
    e.preventDefault();

    setSubmitStatus('idle');
    setSubmitMessage('');
    setAccessCodeError('');
    setIsSubmitting(true);

    try {
      await verifyOrderAccessCode({ username: accessUsername, access_code: accessCode });
      setIsGateUnlocked(true);
      setSubmitStatus('success');
      setSubmitMessage('تم التحقق من بيانات الدخول بنجاح. يمكنك الآن تسجيل طلب جديد.');
    } catch (error: unknown) {
      setSubmitStatus('error');
      const message = error instanceof Error ? error.message : 'تعذر التحقق من رمز الدخول حالياً';
      setAccessCodeError(message);
      setSubmitMessage(message);
    } finally {
      setIsSubmitting(false);
    }
  };

  const handleSubmit = async (e: React.FormEvent) => {
    e.preventDefault();
    
    setSubmitStatus('idle');
    setSubmitMessage('');

    if (!isGateUnlocked) {
      setSubmitStatus('error');
      setSubmitMessage('يجب التحقق من بيانات الدخول قبل إرسال الطلب.');
      return;
    }

    if (!validateForm()) {
      return;
    }

    setIsSubmitting(true);
    try {
      const result = await createDeliveryOrder(formData);
      
      setSubmitStatus('success');
      setSubmitMessage(`تم حفظ الطلب بنجاح. رقم الطلب: ${result.order_no}`);
      setFormData(initialFormState);
      
    } catch (error: unknown) {
      setSubmitStatus('error');
      if (error instanceof Error) {
        setSubmitMessage(error.message);
      } else {
        setSubmitMessage('حدث خطأ غير متوقع في النظام');
      }
    } finally {
      setIsSubmitting(false);
    }
  };

  return {
    state: {
      formData,
      errors,
      isSubmitting,
      submitStatus,
      submitMessage,
      isGateUnlocked,
      accessUsername,
      accessCode,
      accessCodeError,
    },
    handlers: {
      handleFormFieldChange,
      handleAccessUsernameChange,
      handleAccessCodeChange,
      handleUnlockGate,
      handleSubmit,
    },
  };
}