'use server'

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

// ===== Data Structures =====
export interface DashboardKpis {
  totalOrders: number          // aggregated
  currentMonthOrders: number   // aggregated
  deliveredOrders: number      // aggregated
  cancelledOrders: number      // aggregated
}

export interface MonthlyStatItem {
  month: string                // aggregated (YYYY-MM format)
  order_count: number          // aggregated
}

export interface DriverStatItem {
  driverName: string           // data-from: delivery_order-driverName
  order_count: number          // aggregated
}

export interface GovernorateStatItem {
  governorateName: string      // data-from: delivery_order-governorateName
  order_count: number          // aggregated
}

// ===== Input / Output =====
export interface GetMonthlyAnalyticsInput {
  startDate?: string // format: YYYY-MM-DD
  endDate?: string   // format: YYYY-MM-DD
}

export interface GetMonthlyAnalyticsOutput {
  kpis: DashboardKpis
  monthlyTrend: MonthlyStatItem[]
  driverStats: DriverStatItem[]
  governorateStats: GovernorateStatItem[]
}

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

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

/**
 * جلب بيانات الإحصائيات والتحليلات الشهرية
 * يعرض المؤشرات، والمخططات الزمنية، وتحليلات السائقين والمحافظات بناءً على الفلاتر
 */
export const getMonthlyAnalytics = requireRole([UserRole.ADMIN])(
  withResult(async (input: GetMonthlyAnalyticsInput): Promise<GetMonthlyAnalyticsOutput> => {
    
    // 1. إعداد فلتر التاريخ الأساسي
    const baseWhere: any = {}
    
    if (input.startDate) {
      baseWhere.createdAt = {
        ...baseWhere.createdAt,
        gte: new Date(`${input.startDate}T00:00:00.000Z`)
      }
    }
    
    if (input.endDate) {
      const endD = new Date(`${input.endDate}T00:00:00.000Z`)
      endD.setUTCDate(endD.getUTCDate() + 1) // زيادة يوم واحد لضمان شمولية نهاية اليوم
      baseWhere.createdAt = {
        ...baseWhere.createdAt,
        lt: endD
      }
    }

    // 2. حساب المؤشرات الرئيسية (KPIs)
    const [totalOrders, deliveredOrders, cancelledOrders] = await Promise.all([
      prisma.delivery_order.count({ where: baseWhere }),
      prisma.delivery_order.count({ where: { ...baseWhere, status: 'DELIVERED' } }),
      prisma.delivery_order.count({ where: { ...baseWhere, status: 'CANCELLED' } })
    ])

    // طلبات الشهر الحالي (التقويم الفعلي الحالي)
    const now = new Date()
    const startOfCurrentMonth = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), 1))
    const currentMonthOrders = await prisma.delivery_order.count({
      where: {
        createdAt: {
          gte: startOfCurrentMonth
        }
      }
    })

    const kpis: DashboardKpis = {
      totalOrders,
      currentMonthOrders,
      deliveredOrders,
      cancelledOrders
    }

    // 3. تحليل المحافظات (تجميع حسب المحافظة ضمن الفلتر)
    const rawGovernorateStats = await prisma.delivery_order.groupBy({
      by: ['governorateName'],
      _count: { id: true },
      where: baseWhere,
      orderBy: { _count: { id: 'desc' } }
    })
    
    const governorateStats: GovernorateStatItem[] = rawGovernorateStats.map(g => ({
      governorateName: g.governorateName,
      order_count: g._count.id
    }))

    // 4. تحليل السائقين (أعلى 10 سائقين إنجازاً ليتناسب مع المساحة)
    const rawDriverStats = await prisma.delivery_order.groupBy({
      by: ['driverName'],
      _count: { id: true },
      where: baseWhere,
      orderBy: { _count: { id: 'desc' } },
      take: 10
    })

    const driverStats: DriverStatItem[] = rawDriverStats.map(d => ({
      driverName: d.driverName,
      order_count: d._count.id
    }))

    // 5. المخطط الزمني لآخر 12 شهراً
    // تحديد النقطة المرجعية للنهاية (الآن، أو تاريخ النهاية المحدد في الفلتر)
    const baseDateForTrend = input.endDate ? new Date(`${input.endDate}T00:00:00.000Z`) : new Date()
    
    const monthlyStatsPromises: Promise<MonthlyStatItem>[] = []
    for (let i = 11; i >= 0; i--) {
      // حساب بداية ونهاية كل شهر من الأشهر الـ 12 الماضية
      const startOfMonth = new Date(Date.UTC(baseDateForTrend.getUTCFullYear(), baseDateForTrend.getUTCMonth() - i, 1))
      const endOfMonth = new Date(Date.UTC(baseDateForTrend.getUTCFullYear(), baseDateForTrend.getUTCMonth() - i + 1, 1))
      
      const monthLabel = `${startOfMonth.getUTCFullYear()}-${String(startOfMonth.getUTCMonth() + 1).padStart(2, '0')}`
      
      monthlyStatsPromises.push(
        prisma.delivery_order.count({
          where: {
            createdAt: {
              gte: startOfMonth,
              lt: endOfMonth
            }
          }
        }).then(count => ({
          month: monthLabel,
          order_count: count
        }))
      )
    }

    const monthlyTrend: MonthlyStatItem[] = await Promise.all(monthlyStatsPromises)

    return {
      kpis,
      monthlyTrend,
      driverStats,
      governorateStats
    }
  })
)