'use client'
import { useState, useEffect, useCallback, useMemo, useRef } from 'react';
import { useRouter, useSearchParams } from 'next/navigation';
import { ReportExport, MonthlyAnalytics } from '@/backend/route-params';
import { toast } from "sonner";

import type {
  ReportType,
  DeliveryOrderStatus,
  GetReportDataOutput,
  GetFilterOptionsOutput,
  OrderReportItem
} from '@/backend/actions/ReportExport';
import {
  getReportData,
  getFilterOptions
} from '@/backend/actions/ReportExport';

// ===== 枚举映射 =====
const REPORT_TYPE_LABELS: Record<ReportType, string> = {
  ORDERS: 'تقرير الطلبات',
  DRIVERS: 'تقرير السائقين',
  GOVERNORATES: 'تقرير المحافظات'
};

const STATUS_LABELS: Record<DeliveryOrderStatus, string> = {
  PENDING: 'قيد الانتظار',
  IN_PROGRESS: 'قيد التنفيذ',
  DELIVERED: 'تم التوصيل',
  CANCELLED: 'ملغي'
};
const formatCurrency = (amount: number): string =>
  new Intl.NumberFormat('ar-IQ', {
    style: 'currency',
    currency: 'IQD',
    maximumFractionDigits: 0
  }).format(amount);

type OrderReportItemWithAmount = OrderReportItem & {
  totalAmount: number;
};

type ReportExportData = Omit<GetReportDataOutput, 'orders'> & {
  orders?: OrderReportItemWithAmount[];
};


export interface ReportExportState {
  /** 报告类型 */
  reportType: ReportType;
  /** 开始日期 */
  startDate: string;
  /** 结束日期 */
  endDate: string;
  /** 订单状态 */
  status: DeliveryOrderStatus | '';
  /** 本地驱动名称（IME处理） */
  localDriverName: string;
  /** 本地省份名称（IME处理） */
  localGovernorateName: string;
  /** 过滤选项数据 */
  filterOptions: GetFilterOptionsOutput;
  /** 报告表格数据 */
  reportData: GetReportDataOutput;
  /** 加载状态 */
  isLoading: boolean;
  /** 是否有可导出数据 */
  hasData: boolean;
  /** 报告类型标签映射 */
  REPORT_TYPE_LABELS: Record<ReportType, string>;
  /** 状态标签映射 */
  STATUS_LABELS: Record<DeliveryOrderStatus, string>;
}

export interface ReportExportHandlers {
  /** 切换报告类型 */
  setReportType: (val: ReportType) => void;
  /** 设置开始日期 */
  setStartDate: (val: string) => void;
  /** 设置结束日期 */
  setEndDate: (val: string) => void;
  /** 设置订单状态 */
  setStatus: (val: DeliveryOrderStatus | '') => void;
  /** 处理驱动名称变更 */
  handleDriverChange: (val: string) => void;
  /** 处理驱动名称输入法结束 */
  handleDriverCompositionEnd: () => void;
  /** 处理驱动名称输入法开始 */
  handleDriverCompositionStart: () => void;
  /** 处理省份名称变更 */
  handleGovChange: (val: string) => void;
  /** 处理省份名称输入法结束 */
  handleGovCompositionEnd: () => void;
  /** 处理省份名称输入法开始 */
  handleGovCompositionStart: () => void;
  /** 跳转至月度统计 */
  handleGoToAnalytics: () => void;
  /** 导出 CSV */
  handleExportCSV: () => void;
  /** 导出 PDF */
  handleExportPDF: () => void;
}

export const useReportExport = (): { state: ReportExportState, handlers: ReportExportHandlers } => {
  const router = useRouter();
  const searchParams = useSearchParams();
  const initialParams = useMemo(() => ReportExport.getParams(searchParams), [searchParams]);

  // ===== State =====
  const [reportType, setReportType] = useState<ReportType>((initialParams.reportType as ReportType) || 'ORDERS');
  const [startDate, setStartDate] = useState<string>(initialParams.startDate || '');
  const [endDate, setEndDate] = useState<string>(initialParams.endDate || '');
  const [status, setStatus] = useState<DeliveryOrderStatus | ''>((initialParams.status as DeliveryOrderStatus) || '');

  const [driverName, setDriverName] = useState<string>(initialParams.driverName || '');
  const [localDriverName, setLocalDriverName] = useState<string>(initialParams.driverName || '');
  const isComposingDriverRef = useRef(false);

  const [governorateName, setGovernorateName] = useState<string>(initialParams.governorateName || '');
  const [localGovernorateName, setLocalGovernorateName] = useState<string>(initialParams.governorateName || '');
  const isComposingGovRef = useRef(false);

  const [filterOptions, setFilterOptions] = useState<GetFilterOptionsOutput>({ governorates: [], drivers: [] });
  const [reportData, setReportData] = useState<ReportExportData>({});
  const [isLoading, setIsLoading] = useState<boolean>(false);

  // ===== Effects =====
  useEffect(() => {
    getFilterOptions()
      .then(setFilterOptions)
      .catch(error => toast.error(error.message));
  }, []);

  useEffect(() => {
    setIsLoading(true);
    getReportData({
      reportType,
      startDate: startDate || undefined,
      endDate: endDate || undefined,
      governorateName: governorateName || undefined,
      driverName: driverName || undefined,
      status: status || undefined
    })
      .then(data => setReportData(data))
      .catch(error => {
        toast.error(error.message);
        setReportData({});
      })
      .finally(() => setIsLoading(false));
  }, [reportType, startDate, endDate, governorateName, driverName, status]);

  // ===== Handlers =====
  const handleDriverChange = useCallback((val: string) => {
    setLocalDriverName(val);
    if (!isComposingDriverRef.current) {
      setDriverName(val);
    }
  }, []);

  const handleDriverCompositionStart = useCallback(() => {
    isComposingDriverRef.current = true;
  }, []);

  const handleDriverCompositionEnd = useCallback(() => {
    isComposingDriverRef.current = false;
    setDriverName(localDriverName);
  }, [localDriverName]);

  const handleGovChange = useCallback((val: string) => {
    setLocalGovernorateName(val);
    if (!isComposingGovRef.current) {
      setGovernorateName(val);
    }
  }, []);

  const handleGovCompositionStart = useCallback(() => {
    isComposingGovRef.current = true;
  }, []);

  const handleGovCompositionEnd = useCallback(() => {
    isComposingGovRef.current = false;
    setGovernorateName(localGovernorateName);
  }, [localGovernorateName]);

  const handleGoToAnalytics = useCallback(() => {
    MonthlyAnalytics.navigateToWithDateRange(router, { startDate, endDate });
  }, [router, startDate, endDate]);

  const hasData = useMemo(() => {
    if (reportType === 'ORDERS' && reportData.orders && reportData.orders.length > 0) return true;
    if (reportType === 'DRIVERS' && reportData.drivers && reportData.drivers.length > 0) return true;
    if (reportType === 'GOVERNORATES' && reportData.governorates && reportData.governorates.length > 0) return true;
    return false;
  }, [reportType, reportData]);

  const handleExportCSV = useCallback(() => {
    if (!hasData) return;
    try {
      let csvContent = '\uFEFF'; 
      
      if (reportType === 'ORDERS' && reportData.orders) {
        csvContent += 'رقم الطلب,المحافظة,المنطقة,اسم العميل,رقم الهاتف,السائق,نوع الطلب,المبلغ الكلي,الحالة,تاريخ الإنشاء\n';
        reportData.orders.forEach((o: OrderReportItemWithAmount) => {
          csvContent += `"${o.order_no}","${o.governorate_name}","${o.area_name}","${o.customer_name}","${o.customer_phone}","${o.driver_name}","${o.order_type}","${formatCurrency(o.totalAmount)}","${STATUS_LABELS[o.status]}","${new Date(o.created_at).toLocaleDateString('ar-IQ')}"\n`;
        });
      } else if (reportType === 'DRIVERS' && reportData.drivers) {
        csvContent += 'اسم السائق,إجمالي الطلبات,قيد الانتظار,قيد التنفيذ,تم التوصيل,ملغي\n';
        reportData.drivers.forEach(d => {
          csvContent += `"${d.driver_name}",${d.total_orders},${d.pending_orders},${d.in_progress_orders},${d.delivered_orders},${d.cancelled_orders}\n`;
        });
      } else if (reportType === 'GOVERNORATES' && reportData.governorates) {
        csvContent += 'المحافظة,إجمالي الطلبات,قيد الانتظار,قيد التنفيذ,تم التوصيل,ملغي\n';
        reportData.governorates.forEach(g => {
          csvContent += `"${g.governorate_name}",${g.total_orders},${g.pending_orders},${g.in_progress_orders},${g.delivered_orders},${g.cancelled_orders}\n`;
        });
      }

      const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
      const url = URL.createObjectURL(blob);
      const link = document.createElement('a');
      link.href = url;
      link.setAttribute('download', `report_${reportType}_${new Date().getTime()}.csv`);
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
      URL.revokeObjectURL(url);
      toast.success('تم تصدير ملف Excel بنجاح');
    } catch (e) {
      toast.error('حدث خطأ أثناء التصدير');
    }
  }, [hasData, reportType, reportData]);

  const handleExportPDF = useCallback(() => {
    if (!hasData) return;
    window.print();
    toast.success('تم تجهيز التقرير للطباعة / الحفظ كـ PDF');
  }, [hasData]);

  return {
    state: {
      reportType,
      startDate,
      endDate,
      status,
      localDriverName,
      localGovernorateName,
      filterOptions,
      reportData,
      isLoading,
      hasData,
      REPORT_TYPE_LABELS,
      STATUS_LABELS
    },
    handlers: {
      setReportType,
      setStartDate,
      setEndDate,
      setStatus,
      handleDriverChange,
      handleDriverCompositionEnd,
      handleDriverCompositionStart,
      handleGovChange,
      handleGovCompositionEnd,
      handleGovCompositionStart,
      handleGoToAnalytics,
      handleExportCSV,
      handleExportPDF
    }
  };
};
