'use server'

// ===== Enums =====

/** نوع التقرير: الطلبات(ORDERS) | السائقين(DRIVERS) | المحافظات(GOVERNORATES) */
export type ReportType = 'ORDERS' | 'DRIVERS' | 'GOVERNORATES'

/** حالة الطلب: قيد الانتظار(PENDING) | قيد التنفيذ(IN_PROGRESS) | تم التوصيل(DELIVERED) | ملغي(CANCELLED) */
export type DeliveryOrderStatus = 'PENDING' | 'IN_PROGRESS' | 'DELIVERED' | 'CANCELLED'


// ===== Data Structures =====

export interface OrderReportItem {
  order_id: string          // data-from: delivery_order-id
  order_no: string          // data-from: delivery_order-orderNo
  governorate_name: string  // data-from: delivery_order-governorateName
  area_name: string         // data-from: delivery_order-areaName
  customer_name: string     // data-from: delivery_order-customerName
  customer_phone: string    // data-from: delivery_order-customerPhone
  driver_name: string       // data-from: delivery_order-driverName
  order_type: string        // data-from: delivery_order-orderType
  totalAmount: number       // data-from: delivery_order-totalAmount
  status: DeliveryOrderStatus // data-from: delivery_order-status
  created_at: string        // data-from: delivery_order-createdAt
}

export interface DriverReportItem {
  driver_name: string       // data-from: delivery_order-driverName
  total_orders: number      // aggregated
  pending_orders: number    // aggregated
  in_progress_orders: number// aggregated
  delivered_orders: number  // aggregated
  cancelled_orders: number  // aggregated
}

export interface GovernorateReportItem {
  governorate_name: string  // data-from: delivery_order-governorateName
  total_orders: number      // aggregated
  pending_orders: number    // aggregated
  in_progress_orders: number// aggregated
  delivered_orders: number  // aggregated
  cancelled_orders: number  // aggregated
}


// ===== Input / Output =====

export interface GetReportDataInput {
  reportType: ReportType
  /** تاريخ البداية بتنسيق YYYY-MM-DD */
  startDate?: string
  /** تاريخ النهاية بتنسيق YYYY-MM-DD */
  endDate?: string
  governorateName?: string
  driverName?: string
  status?: DeliveryOrderStatus
}

export interface GetReportDataOutput {
  orders?: OrderReportItem[]
  drivers?: DriverReportItem[]
  governorates?: GovernorateReportItem[]
}

export interface GetFilterOptionsOutput {
  governorates: string[]
  drivers: string[]
}


// ===== Imports =====
import prisma from '@/tools/prisma'
import {
  requireRole,
  withResult,
  UserRole
} from '@/backend/action_utils'


// ===== Actions =====

/**
 * الحصول على بيانات التقرير المراد تصديرها (معاينة شاملة)
 */
export const getReportData = requireRole([UserRole.ADMIN])(
  withResult(async (input: GetReportDataInput): Promise<GetReportDataOutput> => {
    const where: any = {}

    // معالجة الفلاتر الزمنية بناءً على نطاق الأيام (UTC)
    if (input.startDate) {
      const start = new Date(`${input.startDate}T00:00:00.000Z`)
      if (!isNaN(start.getTime())) {
        where.createdAt = { ...where.createdAt, gte: start }
      }
    }
    
    if (input.endDate) {
      const end = new Date(`${input.endDate}T00:00:00.000Z`)
      if (!isNaN(end.getTime())) {
        end.setUTCDate(end.getUTCDate() + 1)
        where.createdAt = { ...where.createdAt, lt: end }
      }
    }

    if (input.governorateName) {
      where.governorateName = input.governorateName
    }

    if (input.driverName) {
      where.driverName = input.driverName
    }

    if (input.status) {
      where.status = input.status.toUpperCase()
    }

    // تقرير الطلبات التفصيلي
    if (input.reportType === 'ORDERS') {
      const count = await prisma.delivery_order.count({ where })
      if (count > 10000) {
        throw new Error('حجم البيانات كبير جداً للتصدير. يرجى تضييق نطاق البحث والفترة الزمنية.')
      }

      const orders = await prisma.delivery_order.findMany({
        where,
        orderBy: { createdAt: 'desc' }
      })

      return {
        orders: orders.map(o => ({
          order_id: o.id,
          order_no: o.orderNo,
          governorate_name: o.governorateName,
          area_name: o.areaName,
          customer_name: o.customerName,
          customer_phone: o.customerPhone,
          driver_name: o.driverName,
          order_type: o.orderType,
          totalAmount: Number(o.totalAmount ?? 0),
          status: o.status as DeliveryOrderStatus,
          created_at: o.createdAt.toISOString()
        }))
      }
    } 
    
    // تقرير إحصائيات السائقين
    else if (input.reportType === 'DRIVERS') {
      const orders = await prisma.delivery_order.findMany({
        where,
        select: { driverName: true, status: true }
      })

      const map = new Map<string, DriverReportItem>()
      for (const o of orders) {
        if (!map.has(o.driverName)) {
          map.set(o.driverName, {
            driver_name: o.driverName,
            total_orders: 0,
            pending_orders: 0,
            in_progress_orders: 0,
            delivered_orders: 0,
            cancelled_orders: 0
          })
        }
        const item = map.get(o.driverName)!
        item.total_orders++
        if (o.status === 'PENDING') item.pending_orders++
        if (o.status === 'IN_PROGRESS') item.in_progress_orders++
        if (o.status === 'DELIVERED') item.delivered_orders++
        if (o.status === 'CANCELLED') item.cancelled_orders++
      }

      return { drivers: Array.from(map.values()) }
    } 
    
    // تقرير إحصائيات المحافظات
    else if (input.reportType === 'GOVERNORATES') {
      const orders = await prisma.delivery_order.findMany({
        where,
        select: { governorateName: true, status: true }
      })

      const map = new Map<string, GovernorateReportItem>()
      for (const o of orders) {
        if (!map.has(o.governorateName)) {
          map.set(o.governorateName, {
            governorate_name: o.governorateName,
            total_orders: 0,
            pending_orders: 0,
            in_progress_orders: 0,
            delivered_orders: 0,
            cancelled_orders: 0
          })
        }
        const item = map.get(o.governorateName)!
        item.total_orders++
        if (o.status === 'PENDING') item.pending_orders++
        if (o.status === 'IN_PROGRESS') item.in_progress_orders++
        if (o.status === 'DELIVERED') item.delivered_orders++
        if (o.status === 'CANCELLED') item.cancelled_orders++
      }

      return { governorates: Array.from(map.values()) }
    }

    return {}
  })
)

/**
 * الحصول على الخيارات المتاحة لمرشحات البحث (المحافظات والسائقين)
 */
export const getFilterOptions = requireRole([UserRole.ADMIN])(
  withResult(async (): Promise<GetFilterOptionsOutput> => {
    const governorates = await prisma.delivery_order.findMany({
      distinct: ['governorateName'],
      select: { governorateName: true }
    })

    const drivers = await prisma.delivery_order.findMany({
      distinct: ['driverName'],
      select: { driverName: true }
    })

    return {
      governorates: governorates.map(g => g.governorateName).filter(Boolean),
      drivers: drivers.map(d => d.driverName).filter(Boolean)
    }
  })
)