package shop.alien.storeplatform.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import shop.alien.entity.result.R;
import shop.alien.entity.store.*;
import shop.alien.entity.store.vo.LifeUserOrderVo;
import shop.alien.mapper.*;
import shop.alien.util.common.constant.OrderStatusEnum;
import shop.alien.storeplatform.service.LifeUserOrderPlatformService;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 用户订单服务实现类
 * 负责处理订单的创建、更新、删除、查询、退款等核心业务逻辑
 * 支持代金券和团购券两种类型的订单管理
 *
 * @author alien-cloud
 * @date 2025-11-18
 */
@Service
@RequiredArgsConstructor
public class LifeUserOrderPlatformServiceImpl extends ServiceImpl<LifeUserOrderMapper, LifeUserOrder> implements LifeUserOrderPlatformService {

    private final LifeUserOrderMapper lifeUserOrderMapper;


    private final OrderCouponMiddleMapper orderCouponMiddleMapper;


    /**
     * 查询用户订单列表
     * 支持多条件分页查询订单列表，包括用户、商户、订单类型、订单状态、时间范围等筛选条件
     *
     * @param page 页码
     * @param size 每页数量
     * @param userId 用户ID
     * @param storeId 商户ID
     * @param couponType 订单类型
     * @param orderStatus 订单状态
     * @param name 店铺名称
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return IPage<LifeUserOrderVo> 返回分页订单列表
     * @author alien-cloud
     * @date 2025-11-18
     */
    public IPage<LifeUserOrderVo> queryUserOrderList(Integer page, Integer size, String userId, String storeId, String couponType, String orderStatus, String name, String startTime, String endTime, String orderNo) {
        IPage<LifeUserOrderVo> brandedPage = new Page<>(page, size);
        QueryWrapper<LifeUserOrderVo> lifeUserOrderQueryWrapper = new QueryWrapper<>();
        lifeUserOrderQueryWrapper.eq(org.apache.commons.lang3.StringUtils.isNotBlank(userId), "luo.user_id", userId);
        lifeUserOrderQueryWrapper.eq(org.apache.commons.lang3.StringUtils.isNotBlank(storeId), "luo.store_id", storeId);
        lifeUserOrderQueryWrapper.eq(null != couponType && !"-1".equals(couponType), "luo.coupon_type", couponType);

        // 提取SQL基础部分，避免重复定义
        String baseSql = "select DISTINCT ocm1.order_id from order_coupon_middle ocm1 where 1=1";
        // TODO 应该可以直接判断总表
        if (!"-1".equals(orderStatus)) {
            // 非-1状态：直接添加状态条件
            String sql = baseSql + " and ocm1.status = " + orderStatus;
            if ("2".equals(orderStatus)) {
                // 已完成进行特殊处理,
                sql = sql + " and ocm1.order_id not in (\n" +
                        "\tselect\n" +
                        "\tDISTINCT ocm2.order_id\n" +
                        "from\n" +
                        "\torder_coupon_middle ocm2\n" +
                        "where\n" +
                        "\t ocm2.status = 1\n" +
                        "\t)";
            }
            lifeUserOrderQueryWrapper.inSql("luo.id", sql);
        } else {
            // -1状态且storeId不为空时添加条件
            if (org.apache.commons.lang3.StringUtils.isNotBlank(storeId)) {
                // 注意：原代码中的concat不会修改原字符串，需要重新赋值
                String sql = baseSql + " and ocm1.status not in  (" + OrderStatusEnum.WAIT_PAY.getStatus()
                        + "," + OrderStatusEnum.EXPIRE.getStatus()
                        + "," + OrderStatusEnum.CANCEL.getStatus()
                        + ")";
                lifeUserOrderQueryWrapper.inSql("luo.id", sql);
            }
        }
        lifeUserOrderQueryWrapper.like(org.apache.commons.lang3.StringUtils.isNotBlank(name), "tc.coupon_name", name);
        lifeUserOrderQueryWrapper.like(org.apache.commons.lang3.StringUtils.isNotBlank(orderNo), "luo.order_no", orderNo);
        lifeUserOrderQueryWrapper.gt(org.apache.commons.lang3.StringUtils.isNotBlank(startTime), "luo.created_time", startTime + " 00:00:00");
        lifeUserOrderQueryWrapper.lt(org.apache.commons.lang3.StringUtils.isNotBlank(endTime), "luo.created_time", endTime + " 23:59:59");
        lifeUserOrderQueryWrapper.eq("luo.delete_flag", 0);
        lifeUserOrderQueryWrapper.orderByDesc("luo.created_time");
        lifeUserOrderQueryWrapper.groupBy("luo.coupon_type", "luo.id");
        IPage<LifeUserOrderVo> lifeUserOrderVoIPage = lifeUserOrderMapper.queryUserOrderList(brandedPage, lifeUserOrderQueryWrapper);
        if (!"-1".equals(orderStatus)) {
            lifeUserOrderVoIPage.getRecords().forEach(x -> x.setStatus(Integer.parseInt(orderStatus)));
        }
        // 计算退款金额
        for (LifeUserOrderVo record : lifeUserOrderVoIPage.getRecords()) {
            record.setOrderCouponMiddleList(orderCouponMiddleMapper.selectList(new QueryWrapper<OrderCouponMiddle>().eq("order_id", record.getId())));
            calcExpectIncome(record);
            // 如果代金券为平台优惠券并且是商户查询,则需要计算代金券金额
            if ("3".equals(record.getType()) && org.apache.commons.lang3.StringUtils.isNotBlank(record.getStoreId())) {
                // 如果付款为0，商家收入为套餐原价
                if (record.getFinalPrice().equals("0")) {
                    // 如果付款为0，商家收入为套餐原价*数量
                    record.setFinalPrice(new BigDecimal(record.getPrice()).multiply(new BigDecimal(record.getCouponCount().toString())).toString());
                } else {
                    record.setFinalPrice(record.getNominalValue().add(new BigDecimal(record.getFinalPrice())).toString());
                }
            }
        }
        return lifeUserOrderVoIPage;
    }

    /**
     * 查询用户订单详情
     * 根据订单ID查询订单的详细信息，包括预计收入计算等
     *
     * @param orderId 订单ID
     * @param longitude 经度，用于计算距离
     * @param latitude 纬度，用于计算距离
     * @return R<LifeUserOrderVo> 返回订单详情信息
     * @author alien-cloud
     * @date 2025-11-18
     */
    public R<LifeUserOrderVo> queryUserOrderDetail(String orderId, String longitude, String latitude) {
        LifeUserOrderVo lifeUserOrderVo = lifeUserOrderMapper.queryUserOrderDetail(orderId, org.apache.commons.lang3.StringUtils.isNotBlank(longitude) && org.apache.commons.lang3.StringUtils.isNotBlank(latitude) ? longitude + "," + latitude : "");
        if (null == lifeUserOrderVo) {
            log.error("queryUserOrderDetail未查询到订单");
            return R.fail("未查询到订单");
        }
        calcExpectIncome(lifeUserOrderVo);
        return R.data(lifeUserOrderVo);
    }

    /**
     * 计算预计收入
     * 根据订单信息、退款记录、佣金比例等计算商户的预计收入
     *
     * @param lifeUserOrderVo 订单VO对象
     * @author alien-cloud
     * @date 2025-11-18
     */
    private static void calcExpectIncome(LifeUserOrderVo lifeUserOrderVo) {
        // 退款记录
        List<OrderCouponMiddle> orderCouponMiddleList = lifeUserOrderVo.getOrderCouponMiddleList();
        List<OrderCouponMiddle> refundList = orderCouponMiddleList.stream().filter(x -> x.getStatus() == OrderStatusEnum.REFUND.getStatus()).collect(Collectors.toList());
        lifeUserOrderVo.setRefundList(refundList);
        // 预计收入
        // 退款金额
        BigDecimal refundAmount = new BigDecimal(0);
        if (!CollectionUtils.isEmpty(refundList)) {
            refundAmount = refundList.stream().map(OrderCouponMiddle::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
        }
        // 预计收入
        BigDecimal expectIncome = BigDecimal.ZERO;
        // 如果使用了平台优惠券则预计收入特殊处理
        if ("3".equals(lifeUserOrderVo.getType())) {
            if (lifeUserOrderVo.getFinalPrice().equals("0")) {
                // 如果付款为0，商家收入为套餐原价*数量
                expectIncome = new BigDecimal(lifeUserOrderVo.getPrice()).multiply(new BigDecimal(orderCouponMiddleList.size()));
            } else {
                expectIncome = new BigDecimal(lifeUserOrderVo.getFinalPrice()).add(lifeUserOrderVo.getNominalValue());
            }
        } else {
            expectIncome = new BigDecimal(lifeUserOrderVo.getFinalPrice());
        }
        expectIncome = expectIncome.subtract(refundAmount);
        String commissionRateStr = lifeUserOrderVo.getCommissionRate();
        BigDecimal commissionRate = BigDecimal.ZERO;
        if (org.apache.commons.lang3.StringUtils.isNotBlank(commissionRateStr)) {
            try {
                // 将字符串转换为 BigDecimal，并除以 100（转换为小数）
                commissionRate = new BigDecimal(commissionRateStr)
                        .divide(new BigDecimal("100"), 4, RoundingMode.DOWN);
                // 保留 4 位小数，四舍五入（确保计算精度）
            } catch (NumberFormatException e) {
                // 处理非数字格式的异常（如 commissionRate 为空或非法字符）
                e.printStackTrace();
                // 可根据业务需求设置默认值或抛出提示
            } catch (ArithmeticException e) {
                // 处理除法异常（理论上除以 100 不会出现，此处为稳妥处理）
                e.printStackTrace();
            }
        }
        expectIncome = expectIncome.subtract(expectIncome.multiply(commissionRate)).setScale(2, RoundingMode.DOWN);
        lifeUserOrderVo.setExpectIncome(expectIncome);
    }
}

