'use server'

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

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

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

export interface OrderSummary {
  total_count: number       // aggregated
  pending_count: number     // aggregated
  in_progress_count: number // aggregated
  delivered_count: number   // aggregated
  cancelled_count: number   // aggregated
}

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

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

export interface GetOrderListInput {
  keyword?: string
  governorateName?: string
  driverName?: string
  orderType?: string
  status?: OrderStatus
  startDate?: string
  endDate?: string
  page?: number
  page_size?: number
}

export interface GetOrderListOutput {
  list: OrderListItem[]
  total: number
  summary: OrderSummary
}

export interface DeleteOrderInput {
  order_id: string
}

export interface DeleteOrderOutput {
  success: boolean
}

export interface GetFilterOptionsInput {}

export interface GetFilterOptionsOutput {
  governorates: string[]    // aggregated
  drivers: string[]         // aggregated
  order_types: string[]     // aggregated
}

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

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

/**
 * الحصول على قائمة طلبات التوصيل مع الفلاتر والترقيم وملخص الإحصائيات
 */
export const getOrderList = requireRole([UserRole.ADMIN])(
  withResult(async (input: GetOrderListInput): Promise<GetOrderListOutput> => {
    const page = input.page && input.page > 0 ? input.page : 1
    const pageSize = input.page_size && input.page_size > 0 ? input.page_size : 20
    const skip = (page - 1) * pageSize

    // بناء شروط البحث
    const where: any = {}

    if (input.keyword && input.keyword.trim() !== '') {
      const kw = input.keyword.trim()
      where.OR = [
        { orderNo: { contains: kw } },
        { customerName: { contains: kw } },
        { customerPhone: { contains: kw } },
      ]
    }

    if (input.governorateName && input.governorateName.trim() !== '') {
      where.governorateName = input.governorateName.trim()
    }

    if (input.driverName && input.driverName.trim() !== '') {
      where.driverName = input.driverName.trim()
    }

    if (input.orderType && input.orderType.trim() !== '') {
      where.orderType = input.orderType.trim()
    }

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

    if (input.startDate || input.endDate) {
      where.createdAt = {}
      if (input.startDate) {
        const start = new Date(input.startDate)
        if (!isNaN(start.getTime())) {
          where.createdAt.gte = start
        }
      }
      if (input.endDate) {
        const end = new Date(input.endDate)
        if (!isNaN(end.getTime())) {
          // إضافة يوم لتضمين نهاية اليوم بالكامل في البحث
          end.setDate(end.getDate() + 1)
          where.createdAt.lt = end
        }
      }
    }

    // تنفيذ الاستعلامات بالتوازي
    const [orders, total, statusGroups] = await Promise.all([
      prisma.delivery_order.findMany({
        where,
        orderBy: { createdAt: 'desc' },
        skip,
        take: pageSize,
      }),
      prisma.delivery_order.count({ where }),
      prisma.delivery_order.groupBy({
        by: ['status'],
        where,
        _count: { _all: true },
      }),
    ])

    // تجهيز الإحصائيات
    const summary: OrderSummary = {
      total_count: total,
      pending_count: 0,
      in_progress_count: 0,
      delivered_count: 0,
      cancelled_count: 0,
    }

    for (const group of statusGroups) {
      const count = group._count?._all || 0
      if (group.status === 'PENDING') summary.pending_count = count
      else if (group.status === 'IN_PROGRESS') summary.in_progress_count = count
      else if (group.status === 'DELIVERED') summary.delivered_count = count
      else if (group.status === 'CANCELLED') summary.cancelled_count = count
    }

    // تجهيز قائمة النتائج
    const list: OrderListItem[] = orders.map((order) => ({
      order_id: order.id,
      order_no: order.orderNo,
      customer_name: order.customerName,
      customer_phone: order.customerPhone,
      governorate_name: order.governorateName,
      area_name: order.areaName,
      driver_name: order.driverName,
      order_type: order.orderType,
      total_amount: Number(order.totalAmount),
      status: order.status as OrderStatus,
      created_at: order.createdAt.toISOString(),
    }))

    return {
      list,
      total,
      summary,
    }
  })
)

/**
 * حذف طلب التوصيل بناءً على المعرف (حذف فيزيائي مع السجلات المرتبطة)
 */
export const deleteOrder = requireRole([UserRole.ADMIN])(
  withResult(async (input: DeleteOrderInput): Promise<DeleteOrderOutput> => {
    if (!input.order_id) {
      throw new Error('معرف الطلب مطلوب')
    }

    const order = await prisma.delivery_order.findUnique({
      where: { id: input.order_id },
    })

    if (!order) {
      throw new Error('الطلب غير موجود أو تم حذفه مسبقاً')
    }

    // عملية الحذف الفيزيائي: يجب حذف سجلات الحالة أولاً لتجنب مشكلة المفتاح الأجنبي
    await prisma.$transaction([
      prisma.delivery_order_status_history.deleteMany({
        where: { deliveryOrderId: input.order_id },
      }),
      prisma.delivery_order.delete({
        where: { id: input.order_id },
      }),
    ])

    return { success: true }
  })
)

/**
 * الحصول على الخيارات الفريدة للفلاتر المنسدلة (المحافظة، السائق، نوع الطلب)
 */
export const getFilterOptions = requireRole([UserRole.ADMIN])(
  withResult(async (_input: GetFilterOptionsInput): Promise<GetFilterOptionsOutput> => {
    const [govs, drivers, types] = await Promise.all([
      prisma.delivery_order.findMany({
        select: { governorateName: true },
        distinct: ['governorateName'],
        where: { governorateName: { not: '' } },
      }),
      prisma.delivery_order.findMany({
        select: { driverName: true },
        distinct: ['driverName'],
        where: { driverName: { not: '' } },
      }),
      prisma.delivery_order.findMany({
        select: { orderType: true },
        distinct: ['orderType'],
        where: { orderType: { not: '' } },
      }),
    ])

    return {
      governorates: govs.map((g) => g.governorateName),
      drivers: drivers.map((d) => d.driverName),
      order_types: types.map((t) => t.orderType),
    }
  })
)