package com.xisc.pm.infra.repository.impl;

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

import javax.annotation.Resource;

import org.apache.commons.collections.CollectionUtils;
import org.hzero.mybatis.base.impl.BaseRepositoryImpl;
import org.hzero.mybatis.domian.Condition;
import org.hzero.mybatis.util.Sqls;
import org.springframework.stereotype.Component;

import com.xisc.pm.api.dto.PmProContYieldRequestDTO;
import com.xisc.pm.domain.entity.PmContMscTech;
import com.xisc.pm.domain.entity.PmPlateThickAddvBt;
import com.xisc.pm.domain.entity.PmProContProdTtr;
import com.xisc.pm.domain.repository.PmPlateThickAddvBtRepository;
import com.xisc.pm.infra.constant.PmPlateConstants;
import com.xisc.pm.infra.mapper.PmPlateThickAddvBtMapper;

/**
 * 钢板轧制规格及厚度余量基准表(PmPlateThickAddvBt)资源库
 *
 * @author 纪文桃 wentao.ji01@hand-china.com
 * @since 2024-07-23 17:19:39
 */
@Component
public class PmPlateThickAddvBtRepositoryImpl extends BaseRepositoryImpl<PmPlateThickAddvBt>
        implements PmPlateThickAddvBtRepository {
    @Resource
    private PmPlateThickAddvBtMapper pmPlateThickAddvBtMapper;

    @Override
    public List<PmPlateThickAddvBt> selectList(PmPlateThickAddvBt pmPlateThickAddvBt) {
        return pmPlateThickAddvBtMapper.selectList(pmPlateThickAddvBt);
    }

    @Override
    public PmPlateThickAddvBt selectByPrimary(Long pptabId) {
        PmPlateThickAddvBt pmPlateThickAddvBt = new PmPlateThickAddvBt();
        pmPlateThickAddvBt.setPptabId(pptabId);
        List<PmPlateThickAddvBt> pmPlateThickAddvBts = pmPlateThickAddvBtMapper.selectList(pmPlateThickAddvBt);
        if (CollectionUtils.isEmpty(pmPlateThickAddvBts)) {
            return null;
        }
        return pmPlateThickAddvBts.get(0);
    }
    
    @Override
    public PmPlateThickAddvBt selectWidthAndLenByThick(Long tenantId, String rollDirectCode, String rollMode,
            String heatTreatMode , String stCode, String rollLineNo, String formPlateMode , String adModeCode , BigDecimal orderThick) {
        
        List<PmPlateThickAddvBt> pmPlateThickAddvBts = this
                .selectByCondition(Condition.builder(PmPlateThickAddvBt.class)
                        .andWhere(Sqls.custom().andEqualTo(PmPlateThickAddvBt.FIELD_TENANT_ID, tenantId)
                                .andEqualTo(PmPlateThickAddvBt.FIELD_ROLL_DIRECT_CODE, rollDirectCode)
                                .andEqualTo(PmPlateThickAddvBt.FIELD_HEAT_TREAT_MODE, heatTreatMode)
                                .andEqualTo(PmPlateThickAddvBt.FIELD_ST_CODE, stCode) 
                                .andEqualTo(PmPlateThickAddvBt.FIELD_ROLL_MODE, rollMode) 
                                .andEqualTo(PmPlateThickAddvBt.FIELD_FORM_PLATE_MODE, formPlateMode)
                                .andEqualTo(PmPlateThickAddvBt.FIELD_AD_TYPE_MODE, adModeCode)
                                .andGreaterThanOrEqualTo(PmPlateThickAddvBt.FIELD_PLATE_THICK_TO, orderThick)
                                .andLessThanOrEqualTo(PmPlateThickAddvBt.FIELD_PLATE_THICK_FROM, orderThick)
                                .andEqualTo(PmPlateThickAddvBt.FIELD_ROLL_LINE_NO, rollLineNo))
                        .build());
        if(pmPlateThickAddvBts != null && !pmPlateThickAddvBts.isEmpty()) {
            return pmPlateThickAddvBts.get(0);
        }
        return null;
    }

    @Override
    public PmPlateThickAddvBt selectTaimAddv(Long tenantId, PmProContProdTtr axisPmProContProdTtr,
            PmContMscTech axisPmContMscTech, String rollLineNo, PmProContYieldRequestDTO pmProContYield) {
        String stCode = axisPmProContProdTtr.getProjectCode().substring(0,2);
        List<PmPlateThickAddvBt> pmPlateThickAddvBts = this
                .selectByCondition(Condition.builder(PmPlateThickAddvBt.class)
                        .andWhere(Sqls.custom().andEqualTo(PmPlateThickAddvBt.FIELD_TENANT_ID, tenantId)
                                .andEqualTo(PmPlateThickAddvBt.FIELD_ROLL_DIRECT_CODE, axisPmContMscTech.getRollDirectCode())
                                .andEqualTo(PmPlateThickAddvBt.FIELD_HEAT_TREAT_MODE, axisPmContMscTech.getWholeHeatTreatmentType().contains("Q") ? "Q" : PmPlateConstants.ALL)
                                .andEqualTo(PmPlateThickAddvBt.FIELD_ST_CODE, stCode) 
                                .andEqualTo(PmPlateThickAddvBt.FIELD_FORM_PLATE_MODE, pmProContYield.getPmContFilterRequest().getFormPlateMode())
                                .andEqualTo(PmPlateThickAddvBt.FIELD_AD_TYPE_MODE, axisPmContMscTech.getAdTypeCode())
                                .andEqualTo(PmPlateThickAddvBt.FIELD_ROLL_MODE, axisPmContMscTech.getRollMode())
                                .andGreaterThanOrEqualTo(PmPlateThickAddvBt.FIELD_PLATE_THICK_TO, axisPmProContProdTtr.getOrderThick())
                                .andLessThanOrEqualTo(PmPlateThickAddvBt.FIELD_PLATE_THICK_FROM, axisPmProContProdTtr.getOrderThick())
                                .andGreaterThanOrEqualTo(PmPlateThickAddvBt.FIELD_COMBINE_PLATE_WIDTH_TO,pmProContYield.getCompositeBoard().getSzWidth())
                                .andLessThanOrEqualTo(PmPlateThickAddvBt.FIELD_COMBINE_PLATE_WIDTH_FROM, pmProContYield.getCompositeBoard().getSzWidth())
                                .andEqualTo(PmPlateThickAddvBt.FIELD_ROLL_LINE_NO, rollLineNo))
                        .build());
        if(pmPlateThickAddvBts != null && !pmPlateThickAddvBts.isEmpty()) {
            return pmPlateThickAddvBts.get(0);
        }
        return null;
    }

}
