package cn.ysk.cashier.mybatis.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.ysk.cashier.cons.TableConstant;
import cn.ysk.cashier.dto.shoptable.ReturnOrderDTO;
import cn.ysk.cashier.enums.OrderStatusEnums;
import cn.ysk.cashier.mybatis.mapper.TbOrderDetailMapper;
import cn.ysk.cashier.mybatis.service.MpOrderDetailService;
import cn.ysk.cashier.pojo.order.TbOrderDetail;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * (TbShopPermission)表服务实现类
 *
 * @author makejava
 * @since 2024-09-14 17:08:49
 */
@Service
public class MpOrderDetailServiceImpl extends ServiceImpl<TbOrderDetailMapper, TbOrderDetail> implements MpOrderDetailService {
    @Override
    public boolean updateStatusByOrderIdAndIds(OrderStatusEnums oldOrderStatusEnums, OrderStatusEnums orderStatusEnums, Integer orderId, List<Integer> orderDetails) {
        LambdaUpdateWrapper<TbOrderDetail> wrapper = new LambdaUpdateWrapper<TbOrderDetail>()
                .eq(TbOrderDetail::getOrderId, orderId)
                .in(TbOrderDetail::getId, orderDetails)
                .set(TbOrderDetail::getStatus, orderStatusEnums.getValue());
        if (oldOrderStatusEnums != null) {
            wrapper.eq(TbOrderDetail::getStatus, oldOrderStatusEnums.getValue());
        }
        return update(wrapper);
    }

    @Override
    public boolean updateUseTypeByCartIds(ArrayList<Integer> cartIds, String useType) {
        return update(new LambdaUpdateWrapper<TbOrderDetail>()
                .in(TbOrderDetail::getCartId, cartIds)
                .set(TbOrderDetail::getUseType, useType));
    }

    @Override
    public List<TbOrderDetail> selectByOrderId(Integer orderId) {
        return list(new LambdaQueryWrapper<TbOrderDetail>()
                .eq(TbOrderDetail::getOrderId, orderId));
    }

    @Override
    public List<TbOrderDetail> selectByOrderIdAndState(Integer orderId, TableConstant.OrderInfo.Status... statuses) {
        LambdaQueryWrapper<TbOrderDetail> query = new LambdaQueryWrapper<TbOrderDetail>()
                .eq(TbOrderDetail::getOrderId, orderId);
        if (statuses.length != 0) {
            query.in(TbOrderDetail::getStatus, CollUtil.newArrayList(statuses));
        }
        return list(query);
    }

    @Override
    public List<TbOrderDetail> selectByCartIdOrOrderId(Integer shopId, List<Integer> cartIdList, Integer orderId) {
        return list(new LambdaQueryWrapper<TbOrderDetail>()
                .and(q -> q.in(TbOrderDetail::getCartId, cartIdList).or().eq(TbOrderDetail::getOrderId, orderId))
                .eq(TbOrderDetail::getShopId, shopId));
    }

    @Override
    public boolean updateStatusByOrderId(TableConstant.OrderInfo.Status status, Integer orderId) {
        return update(new LambdaUpdateWrapper<TbOrderDetail>()
                .eq(TbOrderDetail::getOrderId, orderId)
                .set(TbOrderDetail::getStatus, status.getValue()));
    }

    @Override
    public boolean updatePriceByCartId(Integer cartId, BigDecimal saleAmount, BigDecimal totalAmount) {
        return update(new LambdaUpdateWrapper<TbOrderDetail>()
                .eq(TbOrderDetail::getCartId, cartId)
                .set(TbOrderDetail::getPrice, saleAmount)
                .set(TbOrderDetail::getPriceAmount, totalAmount));
    }

    @Override
    public boolean updateMemberByOrderId(Integer orderId, boolean isMember) {
        return update(new LambdaUpdateWrapper<TbOrderDetail>()
                .eq(TbOrderDetail::getOrderId, orderId)
                .set(TbOrderDetail::getIsMember, isMember ? 1 : 0));
    }
}

