package com.haha.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.haha.common.vo.OrderStatisticsVO;
import com.haha.common.vo.OrderVO;
import com.haha.entity.Order;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

public interface OrderService extends IService<Order> {
    
    /**
     * 分页查询订单列表
     *
     * @param page     页码
     * @param pageSize 每页条数
     * @param orderNo  订单号
     * @param deviceId 设备ID
     * @param payStatus 支付状态
     * @param status   订单状态
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @param statusList 订单状态列表（多状态查询）
     * @return 分页结果
     */
    IPage<Order> getPage(int page, int pageSize, String orderNo, String deviceId, 
                         String payStatus, Integer status, String startDate, String endDate,
                         List<Integer> statusList, String phone);
    
    /**
     * 分页查询订单列表（兼容无phone参数调用）
     */
    IPage<Order> getPage(int page, int pageSize, String orderNo, String deviceId, 
                         String payStatus, Integer status, String startDate, String endDate,
                         List<Integer> statusList);
    
    /**
     * 获取订单详情（带标签填充）
     *
     * @param id 订单ID
     * @return 订单详情
     */
    Order getDetailById(Long id);
    
    /**
     * 获取订单详情VO（包含商品列表）
     *
     * @param id 订单ID
     * @return 订单详情VO
     */
    OrderVO getDetailVOById(Long id);
    
    /**
     * 获取订单统计数据
     *
     * @param startDate 开始日期（可选）
     * @param endDate 结束日期（可选）
     * @return 统计数据
     */
    OrderStatisticsVO getStatistics(String startDate, String endDate);
    
    /**
     * 订单退款
     *
     * @param orderId 订单ID
     * @param reason  退款原因
     * @return 是否成功
     */
    boolean refund(Long orderId, String reason);
    
    List<Order> getOrderListByUserId(Long userId, Integer status);
    boolean cancelOrder(Long orderId);
    boolean updateOrderStatus(Long orderId, Integer status);
    Order getOrderByOutTradeNo(String outTradeNo);
    Order getOrderBydeviceId(String deviceId);
    boolean updatePayStatus(String orderNo, String payStatus);

    /**
     * 通知哈哈平台订单支付/退款状态已变更
     */
    void notifyHahaOrderStatusChanged(String orderNo);

    /**
     * 根据活动ID查询订单
     *
     * @param activityId 活动ID
     * @return 订单，如果不存在返回null
     */
    Order getOrderByActivityId(String activityId);

    /**
     * 根据AI识别结果创建订单
     *
     * @param activityId 活动ID
     * @param deviceId 设备ID
     * @param userId 用户ID
     * @param skuListStr SKU列表JSON字符串
     * @param resourceInfoStr 资源信息JSON字符串
     * @param confidence 识别置信度
     * @return 创建的订单，如果无需创建返回null
     */
    Order createOrderFromRecognition(String activityId, String deviceId, String userId,
                                      String skuListStr, String resourceInfoStr, BigDecimal confidence);

    /**
     * 创建订单（带支付分预授权信息），支付分字段在订单创建时直接写入
     */
    Order createOrderFromRecognition(String activityId, String deviceId, String userId,
                                      String skuListStr, String resourceInfoStr, BigDecimal confidence,
                                      String payScoreOrderId, String payScoreState, String serviceId);

    /**
     * 创建订单并初始化支付分服务订单
     *
     * @param activityId 活动ID
     * @param deviceId 设备ID
     * @param userId 用户ID
     * @param skuListStr SKU列表JSON字符串
     * @param resourceInfoStr 资源信息JSON字符串
     * @param confidence 识别置信度
     * @param openId 用户微信openId（用于支付分）
     * @return 创建的订单
     */
    Order createOrderWithPayScore(String activityId, String deviceId, String userId,
                                   String skuListStr, String resourceInfoStr, BigDecimal confidence,
                                   String openId);

    /**
     * 完结订单并触发支付分扣款
     *
     * @param orderId 订单ID
     * @param totalAmount 最终金额
     * @return 是否成功
     */
    boolean completeOrderWithPayScore(Long orderId, BigDecimal totalAmount);

    /**
     * 获取用户订单列表（带商品信息）
     *
     * @param userId 用户ID
     * @param status 订单状态（可选）
     * @return 订单列表Map
     */
    List<Map<String, Object>> getUserOrderListWithProducts(Long userId, Integer status);

    /**
     * 获取用户订单列表（带商品信息，从params Map提取参数）
     *
     * @param userId 用户ID
     * @param params 包含可选参数 status
     * @return 订单列表Map
     */
    List<Map<String, Object>> getUserOrderListWithProducts(Long userId, Map<String, Object> params);

    /**
     * 获取用户订单详情（带商品信息和状态文本）
     *
     * @param userId 用户ID
     * @param orderId 订单ID
     * @param orderNo 订单号
     * @param outTradeNo 商户订单号
     * @return 订单详情Map，不存在返回null
     */
    Map<String, Object> getUserOrderDetail(Long userId, Long orderId, String orderNo, String outTradeNo);

    /**
     * 获取用户订单详情（从params Map提取参数）
     *
     * @param userId 用户ID
     * @param params 包含 orderId/orderNo/outTradeNo 中任意一个
     * @return 订单详情Map，不存在返回null
     */
    Map<String, Object> getUserOrderDetail(Long userId, Map<String, Object> params);

    /**
     * 取消订单（含权限和状态校验）
     *
     * @param userId 用户ID
     * @param orderId 订单ID
     * @return 是否成功
     */
    boolean cancelUserOrder(Long userId, Long orderId);

    /**
     * 取消订单（从params Map提取orderId）
     *
     * @param userId 用户ID
     * @param params 包含 orderId
     * @return 是否成功
     */
    boolean cancelUserOrder(Long userId, Map<String, Object> params);
}
