'use server'

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

// ===== Data Structures =====
export interface OrderEditDetail {
  order_id: string               // data-from: delivery_order-id
  order_no: string               // data-from: delivery_order-orderNo
  order_status: DeliveryOrderStatus // data-from: delivery_order-status
  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
  nearest_landmark: string       // data-from: delivery_order-nearestLandmark
  driver_name: string            // data-from: delivery_order-driverName
  order_type: string             // data-from: delivery_order-orderType
  total_amount: string           // data-from: delivery_order-totalAmount
}

// ===== Input / Output =====
export interface GetOrderForEditInput {
  order_id: string
}

export interface GetOrderForEditOutput {
  order: OrderEditDetail | null
}

export interface UpdateOrderInput {
  order_id: string
  customer_name: string
  customer_phone: string
  governorate_name: string
  area_name: string
  nearest_landmark: string
  driver_name: string
  order_type: string
  total_amount: string
}

export interface UpdateOrderOutput {
  success: boolean
}

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

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

/**
 * جلب تفاصيل الطلب لغرض التعديل
 */
export const getOrderForEdit = requireRole([UserRole.ADMIN])(
  withResult(async (input: GetOrderForEditInput): Promise<GetOrderForEditOutput> => {
    const order = await prisma.delivery_order.findUnique({
      where: { id: input.order_id }
    })

    if (!order) {
      return { order: null }
    }

    return {
      order: {
        order_id: order.id,
        order_no: order.orderNo,
        order_status: order.status as DeliveryOrderStatus,
        customer_name: order.customerName,
        customer_phone: order.customerPhone,
        governorate_name: order.governorateName,
        area_name: order.areaName,
        nearest_landmark: order.nearestLandmark,
        driver_name: order.driverName,
        order_type: order.orderType,
        total_amount: order.totalAmount.toFixed(2),
      }
    }
  })
)

/**
 * حفظ التعديلات على الطلب
 */
export const updateOrder = requireRole([UserRole.ADMIN])(
  withResult(async (input: UpdateOrderInput): Promise<UpdateOrderOutput> => {
    // التحقق من الحقول المطلوبة
    if (
      !input.customer_name?.trim() ||
      !input.customer_phone?.trim() ||
      !input.governorate_name?.trim() ||
      !input.area_name?.trim() ||
      !input.nearest_landmark?.trim() ||
      !input.driver_name?.trim() ||
      !input.order_type?.trim() ||
      !input.total_amount?.trim()
    ) {
      throw new Error('يرجى تعبئة جميع الحقول المطلوبة')
    }

    // التحقق من تنسيق رقم الهاتف (أرقام فقط حسب القواعد)
    if (!/^\d+$/.test(input.customer_phone.trim())) {
      throw new Error('يجب أن يحتوي رقم الهاتف على أرقام فقط')
    }

    const normalizedTotalAmount = input.total_amount.trim()
    if (!/^\d+(\.\d{1,2})?$/.test(normalizedTotalAmount)) {
      throw new Error('يجب إدخال المبلغ الكلي بصيغة رقمية صحيحة')
    }

    // التحقق من وجود الطلب
    const existingOrder = await prisma.delivery_order.findUnique({
      where: { id: input.order_id },
      select: { id: true }
    })

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

    // تحديث بيانات الطلب الأساسية وتحديث وقت التعديل يدوياً
    // ملاحظة: لا يتم تغيير حالة الطلب هنا ولا يتم إنشاء سجل حالة جديد
    await prisma.delivery_order.update({
      where: { id: input.order_id },
      data: {
        customerName: input.customer_name.trim(),
        customerPhone: input.customer_phone.trim(),
        governorateName: input.governorate_name.trim(),
        areaName: input.area_name.trim(),
        nearestLandmark: input.nearest_landmark.trim(),
        driverName: input.driver_name.trim(),
        orderType: input.order_type.trim(),
        totalAmount: normalizedTotalAmount,
        updatedAt: new Date()
      }
    })

    return { success: true }
  })
)
