package com.sw.mes.yb.seed.utils;

import com.sw.mes.base.system.entity.DictionaryItem;
import com.sw.mes.base.system.service.DictionaryItemService;
import com.sw.mes.core.api.system.YbFeignClients;
import com.sw.mes.core.dto.ProductionOrderDto;
import com.sw.mes.core.exception.BusinessException;
import com.sw.mes.core.response.Result;
import com.sw.mes.inspect.entity.YbInspectData;
import com.sw.mes.utils.StringUtils;
import com.sw.mes.core.dto.mes.pc.fb.FbCheckOutDataDto;
import com.sw.mes.yb.plan.entity.ProductionOrder;
import com.sw.mes.yb.plan.service.ProductionOrderService;
import com.sw.mes.yb.seed.entity.SeedData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import javax.validation.constraints.NotNull;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 籽晶编码生成工具类
 */
@Service
public class SeedCodeGeneratorNewUtils {
    @Autowired
    private DictionaryItemService dictionaryItemService;
    @Autowired
    private ProductionOrderService productionOrderService;
    /**
     * 来源:方棒检测数据库
     * 第一行: N,  3,  2,   F,  111,   1  ,1 ,1
     * 第一行: N型(晶编第3位),3月(晶编第6位),二车间(晶编第7位),F区(晶编第8位),111炉台(晶编9,10,11位),1炉(晶编12位),1加(晶编13位),1棒(晶编14位)
     * 第二行: JD,T,4  ,3  ,11 ,1 ,123
     * 第二行: JD定向标识,T段(头尾标识),,24年(new Date()-year),3月(new Date()-month),11号(new Date()-day),1机台(机台),123根(梗数)
     * 最终结果:
     * 第一行:N32F111111
     * 第二行:T143111123
     * @param bySectionNo 圆棒棒检测数据库
     * @return 籽晶编码
     * @throws BusinessException
     */
    public String generator(@NotNull YbInspectData bySectionNo, @NotNull SeedData seedData) throws BusinessException{
        StringBuilder seedCode = new StringBuilder();
        //方棒编码
        String ybSectionNo = bySectionNo.getSectionNo();
        if(StringUtils.isNotEmpty(ybSectionNo) && ybSectionNo.length()>15){
            seedCode.append(ybSectionNo.substring(2, 3));
            seedCode.append(ybSectionNo.substring(5, 14));
        }else {
            throw new BusinessException("请输入正确方棒晶编【"+ybSectionNo+"】!");
        }
        if(StringUtils.isEmpty(bySectionNo.getHeadTailRecognition())){
            throw new BusinessException("未获取到【"+ybSectionNo+"】的头尾标识数据!");
        }
        ProductionOrder productionOrder = productionOrderService.findByAufnr(seedData.getPlanCode());
        if(!ObjectUtils.isEmpty(productionOrder)){
            if (StringUtils.isEmpty(productionOrder.getZorientationind())) {
                seedCode.append("B");
            }else {
                DictionaryItem directionalSign = dictionaryItemService.findByThemeValueAndNameAndEnable("creatCrystalNo",
                        productionOrder.getZorientationind(), true);
                if (directionalSign == null || StringUtils.isEmpty(directionalSign.getValue())) {
                    throw new RuntimeException("【创建晶棒编号】字典中，未配置定向【" + productionOrder.getZorientationind() + "】的对应编号");
                }
                seedCode.append(directionalSign.getValue());
            }
        }
        seedCode.append(bySectionNo.getHeadTailRecognition().substring(0,1));
//        if(null == bySectionNo.getPiecewiseNum()){
//            throw new BusinessException("未获取到【"+ybSectionNo+"】的单晶段号数据!");
//        }
//        seedCode.append(bySectionNo.getPiecewiseNum());
        seedCode.append(buildYear());
        seedCode.append(buildMonth());
        seedCode.append(buildDay());
        seedCode.append(seedData.getSeedCoringDevice());
        seedCode.append(seedData.getSeedBatchNo());
        return seedCode.toString();
    }

    /**
     * 构建日期
     *
     * @return
     */
    private String buildDay() {
        Calendar calendar = Calendar.getInstance();
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        if (day <= 9) {
            return "0" + day;
        }
        return String.valueOf(day);
    }

    /**
     * 构建月
     * 规则：
     * 1、1-9月返回数字
     * 2、10月A 11月B 12月C
     *
     * @return
     */
    private String buildMonth() {
        Calendar calendar = Calendar.getInstance();
        int month = calendar.get(Calendar.MONTH) + 1;//jdk里面取到的值会-1，所以外面需要加1
        if (month <= 9) {
            return String.valueOf(month);
        }
        if (month == 10) {
            return "A";
        } else if (month == 11) {
            return "B";
        } else if (month == 12) {
            return "C";
        }
        return "";
    }

    /**
     * 构建年的值
     * <p>
     * 规则：2023年取3，到2029年位置取9
     * 2030年开始用A,之后用字母循环使用
     *
     * @return
     */
    private String buildYear() {
        SimpleDateFormat format = new SimpleDateFormat("yyyy");
        String yyyy = format.format(new Date());
        return yyyy.substring(3);
    }
}
