package com.cf.imes.module.executor.dal.mysql.plate;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cf.imes.framework.common.enums.DeletedCodeEnum;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.module.executor.controller.admin.manage.plate.vo.plate.PlatePageReqVO;
import com.cf.imes.module.executor.controller.admin.plate.vo.GoodsPlateFilterPageReqVO;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateGoodDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

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

/**
 * 板材信息 Mapper plate
 *
 * @author 晨丰科技
 */
@Mapper
public interface PlateGoodMapper extends BaseMapperX<PlateGoodDO> {

    // goodsId匹配
    default List<PlateGoodDO> selectGoodOne(String id, Long organId) {
        return selectList(new LambdaQueryWrapper<PlateGoodDO>()
                .eq(PlateGoodDO::getGoodsId, id)
                .eq(PlateGoodDO::getDeleted, 0)
                .eq(PlateGoodDO::getOrganId, organId));
    }

    // 其他信息匹配
    default List<PlateGoodDO> selectGood(String goodsName, String material, String color, Boolean texture, BigDecimal width,
                                         BigDecimal thickness, BigDecimal height, String brand, String spec, Long organId) {
        LambdaQueryWrapper<PlateGoodDO> queryWrapper = new LambdaQueryWrapper<PlateGoodDO>()
                .eq(PlateGoodDO::getGoodsName, goodsName)
                .eq(PlateGoodDO::getMaterial, material)
                .eq(PlateGoodDO::getColor, color)
                .eq(PlateGoodDO::getTexture, texture)
                .eq(PlateGoodDO::getWidth, width)
                .eq(PlateGoodDO::getHeight, height)
                .eq(PlateGoodDO::getThickness, thickness)
                .eq(PlateGoodDO::getSpec, spec)
                .eq(PlateGoodDO::getDeleted, 0)
                .eq(PlateGoodDO::getOrganId, organId);
        if (brand == null) {
            queryWrapper.eq(PlateGoodDO::getBrand,"");
        }else {
            queryWrapper.eq(PlateGoodDO::getBrand, brand);
        }
        return selectList(queryWrapper);
    }


    default List<PlateGoodDO> selectGood(String material, String color, BigDecimal thickness,
                                         String brand, String goodsName, Long organId) {
        LambdaQueryWrapper<PlateGoodDO> queryWrapper = new LambdaQueryWrapper<PlateGoodDO>()
                .eq(PlateGoodDO::getGoodsName, goodsName)
                .eq(PlateGoodDO::getMaterial, material)
                .eq(PlateGoodDO::getColor, color)
                .eq(PlateGoodDO::getThickness, thickness)
                .eq(PlateGoodDO::getDeleted, 0)
                .eq(PlateGoodDO::getOrganId, organId);
        if (brand != null) {
            queryWrapper.eq(PlateGoodDO::getBrand, brand);
        }
        return selectList(queryWrapper);
    }

    default PageResult<PlateGoodDO> selectGoodsPage(GoodsPlateFilterPageReqVO pageReqVO, Long organId) {
        return selectPage(pageReqVO, new LambdaQueryWrapperX<PlateGoodDO>()
                .eq(PlateGoodDO::getOrganId,organId)
                .eq(PlateGoodDO::getDeleted,false)
                .likeIfPresent(PlateGoodDO::getGoodsId,pageReqVO.getGoodsIds())
                .likeIfPresent(PlateGoodDO::getGoodsName,pageReqVO.getName())
                .eqIfPresent(PlateGoodDO::getThickness, pageReqVO.getThickness())
                .eqIfPresent(PlateGoodDO::getMaterial, pageReqVO.getMaterial())
                .likeIfPresent(PlateGoodDO::getColor, pageReqVO.getColor())
                .likeIfPresent(PlateGoodDO::getBrand,pageReqVO.getBrand())
                .eqIfPresent(PlateGoodDO::getTexture,pageReqVO.getTexture())
                .likeIfPresent(PlateGoodDO::getSpec,pageReqVO.getSpec())
                .likeIfPresent(PlateGoodDO::getColor,pageReqVO.getFilterColor())
                .betweenIfPresent(PlateGoodDO::getWidth,new BigDecimal[]{pageReqVO.getWidthMinRang(), pageReqVO.getWidthMaxRang()})
                .betweenIfPresent(PlateGoodDO::getHeight,new BigDecimal[]{pageReqVO.getLongMinRang(),pageReqVO.getLongMaxRang()})
                .likeIfPresent(PlateGoodDO::getRemark,pageReqVO.getRemark())
                .orderByDesc(PlateGoodDO::getId)
                .select(PlateGoodDO::getGoodsId, PlateGoodDO::getGoodsName, PlateGoodDO::getMaterial, PlateGoodDO::getColor, PlateGoodDO::getTexture,
                        PlateGoodDO::getWidth, PlateGoodDO::getHeight, PlateGoodDO::getThickness, PlateGoodDO::getBrand, PlateGoodDO::getSpec,
                        PlateGoodDO::getRemark,PlateGoodDO::getColorBlack,PlateGoodDO::getOrganId));
    }




    default List<PlateGoodDO> selectGoodsByGoodsId(List<String> goodsId, Long organId) {
        return selectList(new LambdaQueryWrapper<PlateGoodDO>()
                .eq(PlateGoodDO::getOrganId,organId)
                .eq(PlateGoodDO::getDeleted,false)
                .in(PlateGoodDO::getGoodsId, goodsId));
    }

    default PlateGoodDO selectByGoodID(String goodId, boolean deleted) {
        return selectOne(PlateGoodDO::getGoodsId, goodId, PlateGoodDO::getDeleted, deleted);
    }

    default PageResult<PlateGoodDO> selectPage(PlatePageReqVO reqVO) {
        LambdaQueryWrapperX<PlateGoodDO> queryWrapper = new LambdaQueryWrapperX<PlateGoodDO>()
                .eqIfPresent(PlateGoodDO::getOrganId, reqVO.getOrganId())
                .likeIfPresent(PlateGoodDO::getGoodsId, reqVO.getGoodsId())
                .likeIfPresent(PlateGoodDO::getGoodsName, reqVO.getGoodsName())
                .likeIfPresent(PlateGoodDO::getMaterial, reqVO.getMaterial())
                .likeIfPresent(PlateGoodDO::getColor, reqVO.getColor())
                .eqIfPresent(PlateGoodDO::getWidth, reqVO.getWidth())
                .eqIfPresent(PlateGoodDO::getHeight, reqVO.getHeight())
                .eqIfPresent(PlateGoodDO::getThickness, reqVO.getThickness())
                .likeIfPresent(PlateGoodDO::getBrand, reqVO.getBrand())
                .likeIfPresent(PlateGoodDO::getSpec, reqVO.getSpec())
                .likeIfPresent(PlateGoodDO::getRemark, reqVO.getRemark())
                .eqIfPresent(PlateGoodDO::getTexture, reqVO.getTexture())
                .betweenIfPresent(PlateGoodDO::getCreateTime, reqVO.getCreateTime());

        if (reqVO.getOrder() == null) {
            queryWrapper.orderByDesc(PlateGoodDO::getId);
        }else {
            if (reqVO.getOrder().equals("ascend")) {
                switch (reqVO.getField()) {
                    case "goodsId" -> queryWrapper.orderByAsc(PlateGoodDO::getGoodsId);
                    case "goodsName" -> queryWrapper.orderByAsc(PlateGoodDO::getGoodsName);
                    case "material" -> queryWrapper.orderByAsc(PlateGoodDO::getMaterial);
                    case "color" -> queryWrapper.orderByAsc(PlateGoodDO::getColor);
                    case "texture" -> queryWrapper.orderByAsc(PlateGoodDO::getTexture);
                    case "width" -> queryWrapper.orderByAsc(PlateGoodDO::getWidth);
                    case "height" -> queryWrapper.orderByAsc(PlateGoodDO::getHeight);
                    case "thickness" -> queryWrapper.orderByAsc(PlateGoodDO::getThickness);
                    case "brand" -> queryWrapper.orderByAsc(PlateGoodDO::getBrand);
                    default -> {
                        // default不排序
                    }
                }
            }else if (reqVO.getOrder().equals("descend")) {
                switch (reqVO.getField()) {
                    case "goodsId" -> queryWrapper.orderByDesc(PlateGoodDO::getGoodsId);
                    case "goodsName" -> queryWrapper.orderByDesc(PlateGoodDO::getGoodsName);
                    case "material" -> queryWrapper.orderByDesc(PlateGoodDO::getMaterial);
                    case "color" -> queryWrapper.orderByDesc(PlateGoodDO::getColor);
                    case "texture" -> queryWrapper.orderByDesc(PlateGoodDO::getTexture);
                    case "width" -> queryWrapper.orderByDesc(PlateGoodDO::getWidth);
                    case "height" -> queryWrapper.orderByDesc(PlateGoodDO::getHeight);
                    case "thickness" -> queryWrapper.orderByDesc(PlateGoodDO::getThickness);
                    case "brand" -> queryWrapper.orderByDesc(PlateGoodDO::getBrand);
                    default -> {
                        // default不排序
                    }
                }
            }
        }

        return selectPage(reqVO, queryWrapper);
    }

    PlateGoodDO selectOneById(@Param("id") Long id, @Param("organId") Long organId);

    default Boolean isByGoodID(String goodId , Long organId) {
        return selectList(PlateGoodDO::getGoodsId, goodId, PlateGoodDO::getOrganId, organId).size() > 0;
    }

    default Boolean isByGoodIDAndId(String goodId , Long id) {
        return selectCount(new LambdaQueryWrapper<PlateGoodDO>()
                .ne(PlateGoodDO::getId, id)
                .eq(PlateGoodDO::getGoodsId, goodId)) > 0;
    }

    default List<PlateGoodDO> getAllByOrganId(Long organId) {
        return selectList(new LambdaQueryWrapper<PlateGoodDO>()
                .eq(PlateGoodDO::getOrganId, organId)
                .eq(PlateGoodDO::getDeleted, 0));
    }

    /**
     * 查询机构下名称、材质、颜色、厚度、品牌的分组
     *
     * @param organId
     * @return
     */
    List<LinkedHashMap<String, Object>> getOrgAttrGroup(@Param("organId") Long organId);


    /**
     * 根据商品编号查询板材信息
     *
     * @param goodsIdList
     * @return
     */
    default List<PlateGoodDO> selectGoodsListByGoodsId(@Param("goodsIds") List<String> goodsIdList) {
        return selectList(new LambdaQueryWrapperX<PlateGoodDO>()
                .eq(PlateGoodDO::getDeleted, DeletedCodeEnum.NOT_DELETED.getStatus())
                .in(PlateGoodDO::getGoodsId, goodsIdList));
    }
}
