'use client'

import { useState, useEffect, useCallback, useMemo } from 'react';
import { useRouter, useSearchParams } from 'next/navigation';
import { toast } from "sonner";

import { OrderDetail, OrderManagement, OrderEdit } from '@/backend/route-params';
import { getOrderDetail, changeOrderStatus, deleteOrder } from '@/backend/actions/OrderDetail';
import type { OrderStatus, OrderDetailData } from '@/backend/actions/OrderDetail';

// ===== 枚举映射 =====
const STATUS_LABELS: Record<OrderStatus, string> = {
  PENDING: 'قيد الانتظار',
  IN_PROGRESS: 'قيد التنفيذ',
  DELIVERED: 'تم التوصيل',
  CANCELLED: 'ملغى'
};

export interface OrderDetailState {
  /** 是否正在加载数据 */
  isLoading: boolean;
  /** 原始订单数据 */
  orderData: OrderDetailData | null;
  /** 是否打开删除确认弹窗 */
  isDeleteDialogOpen: boolean;
  /** 是否正在执行删除操作 */
  isDeleting: boolean;
  /** 状态变更弹窗的控制状态 */
  statusChangeDialog: {
    isOpen: boolean;
    targetStatus: OrderStatus | null;
  };
  /** 是否正在执行状态变更操作 */
  isChangingStatus: boolean;
  /** 格式化后的显示数据 */
  displayData: any; 
  /** 状态文本映射表 */
  STATUS_LABELS: Record<OrderStatus, string>;
}

export interface OrderDetailHandlers {
  /** 设置删除弹窗开关 */
  setIsDeleteDialogOpen: (open: boolean) => void;
  /** 设置状态变更弹窗开关 */
  setStatusChangeDialog: (val: { isOpen: boolean; targetStatus: OrderStatus | null }) => void;
  /** 确认删除订单 */
  confirmDelete: () => Promise<void>;
  /** 确认变更订单状态 */
  confirmStatusChange: () => Promise<void>;
  /** 打开指定状态的变更确认弹窗 */
  openStatusChangeDialog: (targetStatus: OrderStatus) => void;
  /** 跳转到订单管理列表 */
  navigateToManagement: () => void;
  /** 跳转到订单编辑页面 */
  navigateToEdit: () => void;
}

export const useOrderDetail = (): { state: OrderDetailState, handlers: OrderDetailHandlers } => {
  const router = useRouter();
  const searchParams = useSearchParams();
  const { orderId } = OrderDetail.getParams(searchParams);

  // ===== State =====
  const [isLoading, setIsLoading] = useState(true);
  const [orderData, setOrderData] = useState<OrderDetailData | null>(null);

  const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);
  const [isDeleting, setIsDeleting] = useState(false);

  const [statusChangeDialog, setStatusChangeDialog] = useState<{
    isOpen: boolean;
    targetStatus: OrderStatus | null;
  }>({ isOpen: false, targetStatus: null });
  const [isChangingStatus, setIsChangingStatus] = useState(false);

  // ===== Handlers Logic =====
  const fetchOrder = useCallback(async (id: string) => {
    setIsLoading(true);
    try {
      const data = await getOrderDetail({ order_id: id });
      setOrderData(data.order);
    } catch (error) {
      const msg = error instanceof Error ? error.message : 'خطأ في جلب البيانات';
      toast.error(msg);
    } finally {
      setIsLoading(false);
    }
  }, []);

  const confirmDelete = async () => {
    if (!orderData) return;
    setIsDeleting(true);
    try {
      await deleteOrder({ order_id: orderData.order_id });
      toast.success('تم حذف الطلب بنجاح');
      OrderManagement.navigateToDefault(router);
    } catch (error) {
      const msg = error instanceof Error ? error.message : 'حدث خطأ أثناء الحذف';
      toast.error(msg);
      setIsDeleting(false);
    }
  };

  const confirmStatusChange = async () => {
    if (!orderData || !statusChangeDialog.targetStatus) return;
    setIsChangingStatus(true);
    try {
      await changeOrderStatus({ 
        order_id: orderData.order_id, 
        new_status: statusChangeDialog.targetStatus 
      });
      toast.success('تم تحديث حالة الطلب بنجاح');
      await fetchOrder(orderData.order_id);
      setStatusChangeDialog({ isOpen: false, targetStatus: null });
    } catch (error) {
      const msg = error instanceof Error ? error.message : 'حدث خطأ أثناء تغيير الحالة';
      toast.error(msg);
    } finally {
      setIsChangingStatus(false);
    }
  };

  const openStatusChangeDialog = (targetStatus: OrderStatus) => {
    setStatusChangeDialog({ isOpen: true, targetStatus });
  };

  const navigateToManagement = () => {
    OrderManagement.navigateToDefault(router);
  };

  const navigateToEdit = () => {
    if (orderData) {
      OrderEdit.navigateToEdit(router, { id: orderData.order_id });
    }
  };

  // ===== Effects =====
  useEffect(() => {
    if (!orderId) {
      OrderManagement.navigateToDefault(router);
    } else {
      fetchOrder(orderId);
    }
  }, [orderId, router, fetchOrder]);

  // ===== Memoized Display Data =====
  const displayData = useMemo(() => {
    if (!orderData) return null;
    return {
      ...orderData,
      created_at_formatted: new Date(orderData.created_at).toLocaleString('ar-IQ'),
      updated_at_formatted: new Date(orderData.updated_at).toLocaleString('ar-IQ'),
      histories: orderData.status_histories.map(h => ({
        ...h,
        created_at_formatted: new Date(h.created_at).toLocaleString('ar-IQ')
      }))
    };
  }, [orderData]);

  const state: OrderDetailState = {
    isLoading,
    orderData,
    isDeleteDialogOpen,
    isDeleting,
    statusChangeDialog,
    isChangingStatus,
    displayData,
    STATUS_LABELS
  };

  const handlers: OrderDetailHandlers = {
    setIsDeleteDialogOpen,
    setStatusChangeDialog,
    confirmDelete,
    confirmStatusChange,
    openStatusChangeDialog,
    navigateToManagement,
    navigateToEdit
  };

  return { state, handlers };
};
