'use server'

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

// ===== Data Structures =====
export interface OrderCreateResult {
  order_id: string       // data-from: delivery_order-id
  order_no: string       // data-from: delivery_order-orderNo
}

// ===== Input / Output =====
export interface CreateDeliveryOrderInput {
  governorate_name: string
  area_name: string
  nearest_landmark: string
  customer_name: string
  customer_phone: string
  driver_name: string
  order_type: string
}

export interface CreateDeliveryOrderOutput extends OrderCreateResult {}

// ===== Imports =====
import prisma from '@/tools/prisma'
import { withResult } from '@/frontend/action_utils'

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

/**
 * إنشاء طلب توصيل جديد
 * متاح للزوار (GUEST) بدون تسجيل دخول
 */
export const createDeliveryOrder = withResult(
  async (input: CreateDeliveryOrderInput): Promise<CreateDeliveryOrderOutput> => {
    // 1. التحقق من الحقول الإلزامية
    if (
      !input.governorate_name?.trim() ||
      !input.area_name?.trim() ||
      !input.nearest_landmark?.trim() ||
      !input.customer_name?.trim() ||
      !input.customer_phone?.trim() ||
      !input.driver_name?.trim() ||
      !input.order_type?.trim()
    ) {
      throw new Error('جميع الحقول مطلوبة.')
    }

    // 2. معالجة وتنسيق رقم الزبون (إزالة المسافات والأقواس والشرطات)
    const cleanedPhone = input.customer_phone.replace(/[\s\-\(\)\+]/g, '')
    const phoneRegex = /^[0-9]+$/
    if (!phoneRegex.test(cleanedPhone)) {
      throw new Error('يرجى إدخال رقم الزبون بالصيغة المحلية الصحيحة (أرقام فقط).')
    }

    // 3. إنشاء رقم طلب فريد
    const uniqueTimestamp = Date.now().toString().slice(-6)
    const randomSuffix = Math.floor(Math.random() * 1000).toString().padStart(3, '0')
    const orderNo = `ORD-${uniqueTimestamp}-${randomSuffix}`

    // 4. الحفظ في قاعدة البيانات عبر معاملة (Transaction) لضمان التكامل
    const result = await prisma.$transaction(async (tx) => {
      // إنشاء الطلب
      const newOrder = await tx.delivery_order.create({
        data: {
          orderNo: orderNo,
          governorateName: input.governorate_name.trim(),
          areaName: input.area_name.trim(),
          nearestLandmark: input.nearest_landmark.trim(),
          customerName: input.customer_name.trim(),
          customerPhone: cleanedPhone,
          driverName: input.driver_name.trim(),
          orderType: input.order_type.trim(),
          status: 'PENDING'
          // createdAt و updatedAt يتم تعيينها تلقائياً حسب المخطط (Schema)
        }
      })

      // إنشاء سجل حالة الطلب الأولي (من null إلى PENDING)
      await tx.delivery_order_status_history.create({
        data: {
          deliveryOrder: { connect: { id: newOrder.id } },
          toStatus: 'PENDING'
          // fromStatus يتم تركه ليأخذ القيمة الافتراضية null
          // changedById يتم تركه null لأن الإجراء يتم بواسطة زائر
        }
      })

      return newOrder
    })

    // 5. إرجاع النتيجة
    return {
      order_id: result.id,
      order_no: result.orderNo
    }
  }
)
