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

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.parts.vo.PartsCadPageReqVO;
import com.cf.imes.module.executor.controller.admin.manage.parts.vo.PartsPageReqVO;
import com.cf.imes.module.executor.dal.dataobject.orderParts.PartsDO;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * 配件表 parts_{N} Mapper
 *
 * @author 晨丰科技
 */
@Mapper
public interface PartsMapper extends BaseMapperX<PartsDO> {

    default PartsDO selectByGoodID(String goodId , Long organId) {
        return selectOne(PartsDO::getGoodsId, goodId, PartsDO::getOrganId, organId);
    }

    default PageResult<PartsDO> selectPage(PartsPageReqVO reqVO) {
        LambdaQueryWrapperX<PartsDO> queryWrapper = new LambdaQueryWrapperX<PartsDO>()
                .eqIfPresent(PartsDO::getOrganId, reqVO.getOrganId())
                .eqIfPresent(PartsDO::getCategory, reqVO.getCategory())
                .likeIfPresent(PartsDO::getGoodsId, reqVO.getGoodsId())
                .likeIfPresent(PartsDO::getColor, reqVO.getColor())
                .likeIfPresent(PartsDO::getType, reqVO.getType())
                .likeIfPresent(PartsDO::getName, reqVO.getName())
                .likeIfPresent(PartsDO::getMaterial, reqVO.getMaterial())
                .likeIfPresent(PartsDO::getModel, reqVO.getModel())
                .likeIfPresent(PartsDO::getSpec, reqVO.getSpec())
                .likeIfPresent(PartsDO::getBrand, reqVO.getBrand())
                .likeIfPresent(PartsDO::getFactory, reqVO.getFactory())
                .likeIfPresent(PartsDO::getUnit, reqVO.getUnit())
                .eqIfPresent(PartsDO::getIsComposite, reqVO.getIsComposite())
                .betweenIfPresent(PartsDO::getWidth, reqVO.getWidth())
                .betweenIfPresent(PartsDO::getLength, reqVO.getLength())
                .betweenIfPresent(PartsDO::getThickness, reqVO.getThickness())
                .likeIfPresent(PartsDO::getRemark, reqVO.getRemark())
                .betweenIfPresent(PartsDO::getCreateTime, reqVO.getCreateTime());

        if (reqVO.getOrder() == null) {
            queryWrapper.orderByDesc(PartsDO::getId);
        }else {
            if (reqVO.getOrder().equals("ascend")) {
                switch (reqVO.getField()) {
                    case "goodsId" -> queryWrapper.orderByAsc(PartsDO::getGoodsId);
                    case "isComposite" -> queryWrapper.orderByAsc(PartsDO::getIsComposite);
                    case "category" -> queryWrapper.orderByAsc(PartsDO::getCategory);
                    case "type" -> queryWrapper.orderByAsc(PartsDO::getType);
                    case "name" -> queryWrapper.orderByAsc(PartsDO::getName);
                    case "model" -> queryWrapper.orderByAsc(PartsDO::getModel);
                    case "material" -> queryWrapper.orderByAsc(PartsDO::getMaterial);
                    case "color" -> queryWrapper.orderByAsc(PartsDO::getColor);
                    case "unit" -> queryWrapper.orderByAsc(PartsDO::getUnit);
                    case "spec" -> queryWrapper.orderByAsc(PartsDO::getSpec);
                    case "brand" -> queryWrapper.orderByAsc(PartsDO::getBrand);
                    case "factory" -> queryWrapper.orderByAsc(PartsDO::getFactory);
                    case "width" -> queryWrapper.orderByAsc(PartsDO::getWidth);
                    case "length" -> queryWrapper.orderByAsc(PartsDO::getLength);
                    case "thickness" -> queryWrapper.orderByAsc(PartsDO::getThickness);
                    default -> {
                        // default不排序
                    }
                }
            }else if (reqVO.getOrder().equals("descend")) {
                switch (reqVO.getField()) {
                    case "goodsId" -> queryWrapper.orderByDesc(PartsDO::getGoodsId);
                    case "isComposite" -> queryWrapper.orderByDesc(PartsDO::getIsComposite);
                    case "category" -> queryWrapper.orderByDesc(PartsDO::getCategory);
                    case "type" -> queryWrapper.orderByDesc(PartsDO::getType);
                    case "name" -> queryWrapper.orderByDesc(PartsDO::getName);
                    case "model" -> queryWrapper.orderByDesc(PartsDO::getModel);
                    case "material" -> queryWrapper.orderByDesc(PartsDO::getMaterial);
                    case "color" -> queryWrapper.orderByDesc(PartsDO::getColor);
                    case "unit" -> queryWrapper.orderByDesc(PartsDO::getUnit);
                    case "spec" -> queryWrapper.orderByDesc(PartsDO::getSpec);
                    case "brand" -> queryWrapper.orderByDesc(PartsDO::getBrand);
                    case "factory" -> queryWrapper.orderByDesc(PartsDO::getFactory);
                    case "width" -> queryWrapper.orderByDesc(PartsDO::getWidth);
                    case "length" -> queryWrapper.orderByDesc(PartsDO::getLength);
                    case "thickness" -> queryWrapper.orderByDesc(PartsDO::getThickness);
                    default -> {
                        // default不排序
                    }
                }
            }
        }

        return selectPage(reqVO, queryWrapper);
    }

    default PartsDO selectById(Long id , Long organId) {
        return selectOne(PartsDO::getId, id, PartsDO::getOrganId, organId);
    }

    default PartsDO selectExceptGoodID(Long id, String goodId , Long organId) {
        return selectOne(new LambdaQueryWrapperX<PartsDO>()
                .ne(PartsDO::getId, id)
                .eq(PartsDO::getGoodsId, goodId)
                .eq(PartsDO::getOrganId, organId));
    }

    default PageResult<PartsDO> selectCadPage(PartsCadPageReqVO reqVO) {
        LambdaQueryWrapperX<PartsDO> queryWrapper = new LambdaQueryWrapperX<PartsDO>()
                .eqIfPresent(PartsDO::getOrganId, reqVO.getOrganId())
                .eqIfPresent(PartsDO::getCategory, reqVO.getCategory())
                .likeIfPresent(PartsDO::getColor, reqVO.getColor())
                .likeIfPresent(PartsDO::getType, reqVO.getType())
                .likeIfPresent(PartsDO::getName, reqVO.getName())
                .likeIfPresent(PartsDO::getMaterial, reqVO.getMaterial())
                .likeIfPresent(PartsDO::getModel, reqVO.getModel())
                .likeIfPresent(PartsDO::getSpec, reqVO.getSpec())
                .likeIfPresent(PartsDO::getBrand, reqVO.getBrand())
                .likeIfPresent(PartsDO::getFactory, reqVO.getFactory())
                .likeIfPresent(PartsDO::getUnit, reqVO.getUnit())
                .eqIfPresent(PartsDO::getIsComposite, reqVO.getIsComposite())
                .eqIfPresent(PartsDO::getWidth, reqVO.getWidth())
                .eqIfPresent(PartsDO::getLength, reqVO.getLength())
                .eqIfPresent(PartsDO::getThickness, reqVO.getThickness())
                .likeIfPresent(PartsDO::getRemark, reqVO.getRemark());

        if (reqVO.getOrder() == null) {
            queryWrapper.orderByDesc(PartsDO::getId);
        }else {
            if (reqVO.getOrder().equals("ascend")) {
                switch (reqVO.getField()) {
                    case "isComposite" -> queryWrapper.orderByAsc(PartsDO::getIsComposite);
                    case "category" -> queryWrapper.orderByAsc(PartsDO::getCategory);
                    case "type" -> queryWrapper.orderByAsc(PartsDO::getType);
                    case "name" -> queryWrapper.orderByAsc(PartsDO::getName);
                    case "model" -> queryWrapper.orderByAsc(PartsDO::getModel);
                    case "material" -> queryWrapper.orderByAsc(PartsDO::getMaterial);
                    case "color" -> queryWrapper.orderByAsc(PartsDO::getColor);
                    case "unit" -> queryWrapper.orderByAsc(PartsDO::getUnit);
                    case "spec" -> queryWrapper.orderByAsc(PartsDO::getSpec);
                    case "brand" -> queryWrapper.orderByAsc(PartsDO::getBrand);
                    case "factory" -> queryWrapper.orderByAsc(PartsDO::getFactory);
                    case "width" -> queryWrapper.orderByAsc(PartsDO::getWidth);
                    case "length" -> queryWrapper.orderByAsc(PartsDO::getLength);
                    case "thickness" -> queryWrapper.orderByAsc(PartsDO::getThickness);
                    default -> {
                        // default不排序
                    }
                }
            }else if (reqVO.getOrder().equals("descend")) {
                switch (reqVO.getField()) {
                    case "isComposite" -> queryWrapper.orderByDesc(PartsDO::getIsComposite);
                    case "category" -> queryWrapper.orderByDesc(PartsDO::getCategory);
                    case "type" -> queryWrapper.orderByDesc(PartsDO::getType);
                    case "name" -> queryWrapper.orderByDesc(PartsDO::getName);
                    case "model" -> queryWrapper.orderByDesc(PartsDO::getModel);
                    case "material" -> queryWrapper.orderByDesc(PartsDO::getMaterial);
                    case "color" -> queryWrapper.orderByDesc(PartsDO::getColor);
                    case "unit" -> queryWrapper.orderByDesc(PartsDO::getUnit);
                    case "spec" -> queryWrapper.orderByDesc(PartsDO::getSpec);
                    case "brand" -> queryWrapper.orderByDesc(PartsDO::getBrand);
                    case "factory" -> queryWrapper.orderByDesc(PartsDO::getFactory);
                    case "width" -> queryWrapper.orderByDesc(PartsDO::getWidth);
                    case "length" -> queryWrapper.orderByDesc(PartsDO::getLength);
                    case "thickness" -> queryWrapper.orderByDesc(PartsDO::getThickness);
                    default -> {
                        // default不排序
                    }
                }
            }
        }

        return selectPage(reqVO, queryWrapper);
    }

    default List<PartsDO> getAllByOrganId(Long organId, String category) {
        return selectList(new LambdaQueryWrapperX<PartsDO>()
                .eq(PartsDO::getOrganId, organId)
                .eq(PartsDO::getCategory, category)
                .eq(PartsDO::getDeleted, 0));
    }
}
