'use server'

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

// ===== Data Structures =====
export interface StatusHistoryItem {
  history_id: string               // data-from: delivery_order_status_history-id
  from_status: OrderStatus | null  // data-from: delivery_order_status_history-fromStatus
  to_status: OrderStatus           // data-from: delivery_order_status_history-toStatus
  changed_by_name: string | null   // data-from: account_user-account
  created_at: string               // data-from: delivery_order_status_history-createdAt
}

export interface OrderDetailData {
  order_id: string                 // data-from: delivery_order-id
  order_no: string                 // data-from: delivery_order-orderNo
  status: OrderStatus              // data-from: delivery_order-status
  created_at: string               // data-from: delivery_order-createdAt
  updated_at: string               // data-from: delivery_order-updatedAt
  
  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
  
  status_histories: StatusHistoryItem[] // aggregated
}

// ===== Input / Output =====
export interface GetOrderDetailInput {
  order_id: string
}
export interface GetOrderDetailOutput {
  order: OrderDetailData
}

export interface ChangeOrderStatusInput {
  order_id: string
  new_status: OrderStatus
}
export interface ChangeOrderStatusOutput {
  success: boolean
}

export interface DeleteOrderInput {
  order_id: string
}
export interface DeleteOrderOutput {
  success: boolean
}

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

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

export const getOrderDetail = requireRole([UserRole.ADMIN])(
  withResult(async (input: GetOrderDetailInput): Promise<GetOrderDetailOutput> => {
    const { order_id } = input
    
    const order = await prisma.delivery_order.findUnique({
      where: { id: order_id },
      include: {
        statusHistories: {
          orderBy: { createdAt: 'desc' },
          include: {
            changedBy: {
              select: { account: true }
            }
          }
        }
      }
    })

    if (!order) {
      throw new Error('الطلب غير موجود') // الطلب غير موجود
    }

    return {
      order: {
        order_id: order.id,
        order_no: order.orderNo,
        status: order.status as OrderStatus,
        created_at: order.createdAt.toISOString(),
        updated_at: order.updatedAt.toISOString(),
        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,
        status_histories: order.statusHistories.map(h => ({
          history_id: h.id,
          from_status: (h.fromStatus as OrderStatus) || null,
          to_status: h.toStatus as OrderStatus,
          changed_by_name: h.changedBy?.account || null,
          created_at: h.createdAt.toISOString()
        }))
      }
    }
  })
)

export const changeOrderStatus = requireRole([UserRole.ADMIN])(
  withResult(async (input: ChangeOrderStatusInput): Promise<ChangeOrderStatusOutput> => {
    const { order_id, new_status } = input
    const { userId } = getAuthContext()
    
    const uppercaseNewStatus = new_status.toUpperCase() as OrderStatus

    // 1. 获取当前状态
    const order = await prisma.delivery_order.findUnique({
      where: { id: order_id },
      select: { id: true, status: true }
    })

    if (!order) {
      throw new Error('الطلب غير موجود') // الطلب غير موجود
    }

    const currentStatus = order.status as OrderStatus

    // 2. 验证状态机
    let isValid = false
    if (currentStatus === 'PENDING') {
      if (uppercaseNewStatus === 'IN_PROGRESS' || uppercaseNewStatus === 'CANCELLED') {
        isValid = true
      }
    } else if (currentStatus === 'IN_PROGRESS') {
      if (uppercaseNewStatus === 'DELIVERED' || uppercaseNewStatus === 'CANCELLED') {
        isValid = true
      }
    }

    if (!isValid) {
      throw new Error('حالة الطلب الحالية لا تسمح بهذا الانتقال') // حالة الطلب الحالية لا تسمح بهذا الانتقال
    }

    // 3. 在同一事务内完成更新订单并写入状态变更历史
    const now = new Date()
    
    await prisma.$transaction(async (tx) => {
      // 防止并发状态被篡改，在事务内再查一次
      const currentOrder = await tx.delivery_order.findUnique({
        where: { id: order_id },
        select: { status: true }
      })
      if (currentOrder?.status !== currentStatus) {
        throw new Error('تم تعديل حالة الطلب بالفعل، يرجى تحديث الصفحة') // تم تعديل حالة الطلب بالفعل
      }
      
      await tx.delivery_order.update({
        where: { id: order_id },
        data: {
          status: uppercaseNewStatus as any,
          updatedAt: now,
          statusHistories: {
            create: {
              fromStatus: currentStatus as any,
              toStatus: uppercaseNewStatus as any,
              changedBy: { connect: { id: userId } },
              createdAt: now
            }
          }
        }
      })
    })

    return { success: true }
  })
)

export const deleteOrder = requireRole([UserRole.ADMIN])(
  withResult(async (input: DeleteOrderInput): Promise<DeleteOrderOutput> => {
    const { order_id } = input
    
    // 检查订单是否存在
    const order = await prisma.delivery_order.findUnique({
      where: { id: order_id }
    })
    
    if (!order) {
      throw new Error('الطلب غير موجود') // الطلب غير موجود
    }

    // 在同一个事务中，先删除历史记录，然后物理删除订单本身
    await prisma.$transaction([
      prisma.delivery_order_status_history.deleteMany({
        where: { deliveryOrderId: order_id }
      }),
      prisma.delivery_order.delete({
        where: { id: order_id }
      })
    ])

    return { success: true }
  })
)
