package com.ycwl.basic.order.service;

import com.github.pagehelper.PageInfo;
import com.ycwl.basic.dto.MobileOrderRequest;
import com.ycwl.basic.order.dto.*;
import com.ycwl.basic.order.entity.OrderV2;
import com.ycwl.basic.order.enums.RefundStatus;
import com.ycwl.basic.pricing.dto.PriceCalculationResult;
import com.ycwl.basic.order.dto.PaymentParamsRequest;
import com.ycwl.basic.order.dto.PaymentParamsResponse;
import com.ycwl.basic.order.dto.PaymentCallbackResponse;

import jakarta.servlet.http.HttpServletRequest;

/**
 * 订单服务接口
 */
public interface IOrderService {
    
    /**
     * 创建订单
     * 
     * @param request 移动端下单请求
     * @param userId 用户ID
     * @param scenicId 景区ID
     * @param priceResult 价格计算结果
     * @return 订单ID
     */
    Long createOrder(MobileOrderRequest request, Long userId, Long scenicId, PriceCalculationResult priceResult);
    
    /**
     * 根据订单号查询订单
     * 
     * @param orderNo 订单号
     * @return 订单信息
     */
    OrderV2 getByOrderNo(String orderNo);
    
    /**
     * 根据订单ID查询订单
     * 
     * @param orderId 订单ID
     * @return 订单信息
     */
    OrderV2 getById(Long orderId);
    
    /**
     * 更新订单状态
     * 
     * @param orderId 订单ID
     * @param orderStatus 订单状态
     * @param paymentStatus 支付状态
     * @return 更新结果
     */
    boolean updateOrderStatus(Long orderId, String orderStatus, String paymentStatus);
    
    /**
     * 生成订单号
     * 
     * @return 订单号
     */
    String generateOrderNo();
    
    // ====== 新增方法 ======
    
    /**
     * 分页查询订单列表
     * 
     * @param request 分页查询请求
     * @return 分页结果
     */
    PageInfo<OrderV2ListResponse> pageOrders(OrderV2PageRequest request);
    
    /**
     * 查询订单详情（包含商品明细、优惠记录、退款记录）
     * 
     * @param orderId 订单ID
     * @return 订单详情
     */
    OrderV2DetailResponse getOrderDetail(Long orderId);
    
    /**
     * 更新订单备注
     * 
     * @param orderId 订单ID
     * @param remarks 备注内容
     * @return 更新结果
     */
    boolean updateOrderRemarks(Long orderId, String remarks);
    
    /**
     * 更新支付状态
     * 
     * @param orderId 订单ID
     * @param paymentStatus 支付状态
     * @return 更新结果
     */
    boolean updatePaymentStatus(Long orderId, String paymentStatus);
    
    /**
     * 更新退款状态
     * 
     * @param orderId 订单ID
     * @param refundStatus 退款状态
     * @param refundNo 退款单号（幂等键）
     * @param paymentRefundId 支付平台退款单号
     * @return 更新结果
     */
    boolean updateRefundStatus(Long orderId, RefundStatus refundStatus, String refundNo, String paymentRefundId);
    
    /**
     * 创建退款记录
     * 
     * @param request 退款申请请求
     * @return 退款记录ID
     */
    Long createRefundRecord(RefundRequest request);
    
    /**
     * 根据用户ID分页查询订单列表（移动端使用）
     * 
     * @param request 分页查询请求（已设置用户ID）
     * @return 分页结果
     */
    PageInfo<OrderV2ListResponse> pageOrdersByUser(OrderV2PageRequest request);
    
    // ====== 支付相关方法 ======
    
    /**
     * 获取订单支付参数
     * 
     * @param orderId 订单ID
     * @param userId 用户ID（用于权限验证和获取openId）
     * @param request 支付参数请求
     * @return 支付参数响应
     */
    PaymentParamsResponse getPaymentParams(Long orderId, Long userId, PaymentParamsRequest request);
    
    /**
     * 处理支付回调
     * 
     * @param scenicId 景区ID
     * @param request HTTP请求对象
     * @return 回调处理结果
     */
    PaymentCallbackResponse handlePaymentCallback(Long scenicId, HttpServletRequest request);
}
