package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.numberrule;

import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.StringUtilExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.api.iservice.base.IConfigService;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.INumberRulePackAttributeStrategyService;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesConfig;
import cn.estsh.i3plus.pojo.mes.bean.MesCustomerPart;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import cn.estsh.i3plus.pojo.mes.repository.MesCustomerPartRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.Date;
import java.util.Map;
import java.util.Objects;

/**
 * @Description :
 * @Reference :
 * @Author : Castle
 * @CreateDate : 2024/7/6 14:01
 * @Modify:
 **/
@Component
public class GqxnyNumberRuleStrategyService implements INumberRulePackAttributeStrategyService {

    @Autowired
    private IConfigService configService;

    @Autowired
    private MesCustomerPartRepository customerPartRepository;

    @Override
    public GenSerialNoModel execute(GenSerialNoModel genSerialNoModel) {
        //----广乘 45位 GQXNY
        //{custPartNo}{SPILTURE}{custCode}{spiltrure}{spiltrule}{year}{serialNo}{spilture}{spiltrule}
        //客户零件号-扩展位-客户代码-预留位000-产线1-年月日-条码-扩展0000-追溯位+
        //零件长号---17位,不足17位 右边补*
        //获取客户零件号
        Map<String, Object> dataMap = genSerialNoModel.getDataMap();
        MesCustomerPart customerPart = (!CollectionUtils.isEmpty(dataMap) && dataMap.containsKey(MesCustomerPart.class.getSimpleName())) ?
                (MesCustomerPart)dataMap.get(MesCustomerPart.class.getSimpleName()) : getMesCustomerPart(genSerialNoModel.getOrganizeCode(), genSerialNoModel.getPartNo());
        if (null != customerPart) {
            genSerialNoModel.setCustPartNo(customerPart.getCustPartNo());
        }

        //拓展位 2位 00 包含0~9,A~Z 不使用时，补“0”填充 {SPILTRULE}
        //供应商代码 7位 供应商代码 0~9,A~Z;不足7位 右测补*
        MesConfig supplierConfig = configService.getMesConfigByCfgCodeKeyOrg(MesPcnExtConstWords.SUPPLIER_CODE, MesExtEnumUtil.MES_PRINT_TEMPLATE.GQXNY.getValue(), genSerialNoModel.getOrganizeCode());
        if (null != supplierConfig) {
            String supplierCode = supplierConfig.getCfgValue();
            genSerialNoModel.setCustCode(StringUtilExt.stringFormat(supplierCode, 7,MesPcnExtConstWords.SEPARATOR));
        }

        //扩展位 3位 预留扩展位0~9 A~Z 不使用时，补 0 {SPILTRULE}
        //产线 1位 供应商产线号，表示由数字1~9 和字母A~Z(I/O除外)组成; {SPILTRULE}
        //年月日 6位 yyMMdd 零部件生产日期，年月日各2位
        Date date = new Date();
        String year = TimeTool.pareDateToString(MesPcnExtConstWords.DATE_FORMAT_SHORT, date);
        genSerialNoModel.setYear(year);
        //流水号 4位 采用34进制 0001~ZZZZ (I、O除外)顺位进行标注 (同广汽 & 广新) {serialNo}
        //扩展位 4位 预留扩展位信息，包含0~9和字母A~Z,不使用时，补“0” 填充;  {SPILTRULE}
        //追溯标识 1位 + 代表精确按件追溯，$标识按批追溯, % 代表按生产方式追溯  {SPILTRULE}

        return genSerialNoModel;
    }

    private MesCustomerPart getMesCustomerPart(String orgaizeCode, String partNo) {
        if (StringUtils.isEmpty(orgaizeCode) || StringUtils.isEmpty(partNo)) return null;
        DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(orgaizeCode);
        DdlPreparedPack.getStringEqualPack(partNo, MesPcnExtConstWords.ERP_PART_NO, ddlPackBean);
        MesCustomerPart customerPart = customerPartRepository.getByProperty(ddlPackBean);
        if (Objects.isNull(customerPart)) {
            MesPcnException.throwMesBusiException("物料【%s】客户零件关系未维护", partNo);
        }
        return customerPart;
    }

}
