public without sharing class Product2Handler extends Oly_TriggerHandler {
    private Map<Id, Product2> newMap;
    private Map<Id, Product2> oldMap;
    private List<Product2> newList;
    private List<Product2> oldList;

    public Product2Handler() {
        this.newMap = (Map<Id, Product2>) Trigger.newMap;
        this.oldMap = (Map<Id, Product2>) Trigger.oldMap;
        this.newList = (List<Product2>) Trigger.new;
        this.oldList = (List<Product2>) Trigger.old;
    }

    protected override void beforeInsert() {
        beforeSetValue();
        // SWAG-BHE9GK LHJ 竞争对手产品自动编码 Start
        SetCompetitorCode();
        // SWAG-BHE9GK LHJ 竞争对手产品自动编码 End
    }
    protected override void beforeUpdate() {
        beforeSetValue();
        //SFDC停止预警  lt  20211015 add start
        // FlgStopManufacure(this.newList, this.oldMap);
        //SFDC停止预警  lt  20211015 add end
        FlgStopManufacure();

    }

    //SFDC停止预警  lt  20210922 add start
    protected override void afterUpdate(){
        Calculate_AverageMonthSales(this.newList, this.oldMap);
    }
    //SFDC停止预警  lt  20210922 add end

    // SWAG-BHE9GK LHJ 竞争对手产品自动编码 Start
    private void SetCompetitorCode() {
        Boolean SelctFlg = False;
        list<AggregateResult> proList;
        String strPC = '';
        Integer i = 1;

        for (Product2 nObj : newList) {
            if (nObj.Competitor_product_dummy__c) {
                SelctFlg = True;
            }
        }
        if (SelctFlg) {
            proList = [Select Max(ProductCode) PC From Product2 Where ProductCode Like 'SD%'];
            if (proList != null && proList.size() > 0) {
                strPC = String.valueof(proList[0].get('PC'));
            }
        }
        for (Product2 nObj : newList) {
            if (nObj.Competitor_product_dummy__c && strPC.length() == 8
                    && proList != null && proList.size() > 0 ) {
                Integer num = Integer.valueOf(strPC.SubString(2,strPC.length())) + i;
                nObj.ProductCode  = 'SD' + String.valueOf(num).leftpad(6,'0');
                i++;
            }
        }
    }
    // SWAG-BHE9GK LHJ 竞争对手产品自动编码 End

    private void beforeSetValue() {

        for (Product2 nObj : newList) {
            //CHAN-B8GCBB
            if (nObj.WhiteSpace__c == true) {
                nObj.StorageStatus__c = String.valueOf(nObj.StorageStatusNo__c);
            } else {
                nObj.StorageStatus__c = '';
            }
            //CHAN-B8GCBB

            nObj.Fixture_Model_No_T__c = nObj.Fixture_Model_No_F__c;
            // CBPR LHJ
            if (Trigger.isInsert || 
                    (Trigger.isUpdate && nObj.SFDA_Status_New__c != oldMap.get(nObj.id).SFDA_Status_New__c)) {
                nObj.SFDA_Status__c = nobj.SFDA_Status_New__c;
                if (nobj.SFDA_Status_New__c == '新製品申請中' || nobj.SFDA_Status_New__c == '準備中') {
                    nObj.SFDA_Status__c = '停止';
                }
            }
            // CBPR LHJ
            
            // SWAG-BHE9GK LHJ 竞争对手产品自动编码 Start
            if (Trigger.isInsert) {

            }
            // SWAG-BHE9GK LHJ 竞争对手产品自动编码 End
        }
    }

    //SFDC停止预警  lt  20210914 add start
    private static void Calculate_AverageMonthSales(List<Product2> newList,Map<Id, Product2> oldMap){

        //符合条件的 旧 产品List
        List<Id> oproList = new List<Id>();
        //符合条件的 新旧 产品Id List  作为条件
        List<Id> conList = new List<Id>();
        //Map<旧的，新的>对应
        Map<String,String> matMap = new Map<String,String>();
        
        //Map<旧Id，预计停止日>
        Map<String,Date> adateMap = new Map<String,Date>();

        //Map<旧Id, x(平均月销量)>
        Map<String,Integer> xMap = new Map<String,Integer>();
        //Map<旧Id, z(天数)>
        Map<String,Integer> zMap = new Map<String,Integer>();

        for(Product2 term : newList){
            System.debug('标识'+term.CalMonthSalesFLG__c);
            System.debug('新库存'+term.StorageStatusNo__c);
            System.debug('旧库存'+oldMap.get(term.Id).StorageStatusNo__c);
            if(term.M_BC_Stop_manufacure__c != null && term.SFDA_Status__c != '停止' && (term.StorageStatusNo__c != oldMap.get(term.Id).StorageStatusNo__c || term.CalMonthSalesFLG__c == true)){
                if(term.Correspond_Code__c != null){
                    matMap.put((String)term.Id,(String)term.Correspond_Code__c);
                    conList.add(term.Correspond_Code__c);
                }
                conList.add(term.Id);
                oproList.add(term.Id);

                adateMap.put(term.Id, term.M_BC_Stop_manufacure__c);
            }
        }

        //做 一对多 的 Map<String,List<月销量>>
        Map<String,List<ProductMonthlySales__c>> msMap = new Map<String,List<ProductMonthlySales__c>>();

        if(conList.size()>0){
            List<ProductMonthlySales__c> msList = [Select Id, MonthSales__c, CurrentMonth__c, CurrentDate__c, 
                                                          CurrentYear__c, ProductM__c, Product2Model__c, 
                                                          ProductM__r.StorageStatusNo__c,
                                                          ProductM__r.M_BC_Stop_manufacure__c
                                                   From ProductMonthlySales__c
                                                   Where ProductM__c in: conList
                                                   Order by CurrentDate__c DESC];
            //双层循环  产品==>月销量
            for(Id pro : conList){
                for(ProductMonthlySales__c mms : msList){
                    if(pro == mms.ProductM__c){
                        if(msMap.containsKey(pro)){
                            msMap.get(pro).add(mms);
                        }else{
                            List<ProductMonthlySales__c> pmsaleList = new List<ProductMonthlySales__c>();
                            pmsaleList.add(mms);
                            msMap.put(pro, pmsaleList);
                        }
                    }

                }
            }
 
            System.debug('条件List'+conList);
            System.debug('sql查到的List'+msList);
            System.debug('产品月销量msMap为'+msMap);
            System.debug('旧的产品List'+oproList);

            if(msMap.size() > 0){
                System.debug('产品月销量msMap为'+msMap);
                for(Id res : oproList){

                    //a旧 月销量和  ; b新 月销量和 ; c商(平均月销量) ; x商四舍五入 ;
                    //y 库存/平均月销量天数 ; z 天数 四舍五入
                    Decimal c = 0, y = 0;
                    Integer x = 0, z = 0;

                    if(msMap.get(res) != null){
                        //月销量大于12个月
                        if(msMap.get(res).size() >= 12){
                            Decimal a = 0 , b = 0;
                            Integer i;
                            for(i = 0 ; i < 12 ; i++){
                                a += msMap.get(res)[i].MonthSales__c;
                            }
                            if(matMap.get(res) != null){
                                if(msMap.get(matMap.get(res)) != null){
                                    if(msMap.get(matMap.get(res)).size() >= 12){
                                        for(i = 0 ; i < 12 ; i++){
                                            b += msMap.get(matMap.get(res))[i].MonthSales__c;
                                            System.debug('新的大于十二'+b);
                                        }
                                    }
                                    else{
                                        for(ProductMonthlySales__c nms : msMap.get(matMap.get(res))){
                                            b+=nms.MonthSales__c;
                                            System.debug('新的小于十二遍历全部'+b);
                                        }
        
                                    }
                                }
                            }
                            
                            //四舍五入  
                            c = (a + b) / 12 ;
    
                            if(c > 1){
                                x = Integer.valueOf(c.round(System.RoundingMode.HALF_UP));
                                xMap.put(res,x);
                            }else if(c > 0){
                                x = 1;
                                xMap.put(res,x);
                            }
                            //x = Integer.valueOf(c.round(System.RoundingMode.Up));
                            //x = Integer.valueOf(c.round(System.RoundingMode.HALF_UP));
    
                            System.debug('新'+b);
                            System.debug('旧'+a);
                            System.debug('除法足c'+c);
                            System.debug('四舍五入x'+x);
    
                        }
                        //月销量不足12个月
                        else{
                            Decimal a = 0 , b = 0 ;
                            for(ProductMonthlySales__c oms : msMap.get(res)){
                                a+=oms.MonthSales__c;
                            }
                            if(msMap.get(matMap.get(res)) != null){
                                for(ProductMonthlySales__c nms : msMap.get(matMap.get(res))){
                                    b+=nms.MonthSales__c;
                                }
                            }
                            c = (a + b) / msMap.get(res).size();
                            //x = Integer.valueOf(c.round(System.RoundingMode.UP));
                            //x = Integer.valueOf(c.round(System.RoundingMode.HALF_UP));
                            if(c > 1){
                                x = Integer.valueOf(c.round(System.RoundingMode.HALF_UP));
                                xMap.put(res,x);
                            }else if(c > 0){
                                x = 1;
                                xMap.put(res,x);
                            }
    
                            System.debug('除法不足12c'+c);
                            System.debug('四舍五入x'+x);
                        }

                        if(x != 0){
                            for(ProductMonthlySales__c dat : msMap.get(res)){
                                Decimal m = 0;
                                if(dat.ProductM__r.StorageStatusNo__c != null){
                                    m = dat.ProductM__r.StorageStatusNo__c;
                                } 
                                y = m / x;
                                y = y * 30 ;
                            }
                        }
                        //z = Integer.valueOf(y.round(System.RoundingMode.UP));
                        z = Integer.valueOf(y.round(System.RoundingMode.HALF_UP));
                        zMap.put(res,z);
                        System.debug('天数y'+y);
                        System.debug('四舍五入z'+z);

                    }
                }
            }

            List<Product2> finList = new List<Product2>();
            for(Id fin : oproList){
                Product2 fip = new Product2();
                fip.Id = fin;
                fip.CalMonthSalesFLG__c = false;

                if(xMap.get(fin) != null){
                    fip.Average_MonthSales__c = xMap.get(fin);
                }

                //20211020
                if(zMap.get(fin) != null){
                    if(zMap.get(fin) != 0){
                        fip.Estimated_ConsumptionDueDate__c = Date.today().addDays(zMap.get(fin));
                    }else{
                        if(adateMap != null){
                            Date adate = adateMap.get(fin);
                            fip.Estimated_ConsumptionDueDate__c = adate;
                        }
                    }
                }else{
                    if(adateMap != null){
                        Date adate = adateMap.get(fin);
                        fip.Estimated_ConsumptionDueDate__c = adate;
                    }
                }
                //20211020
                
                finList.add(fip);
            }
            update finList;
        } 

    }
    //SFDC停止预警  lt  20210914 add end

    //SFDC停止预警  lt  20211015 add start
    //ProductMonthlySalesFlag__c  12月销量标识  预计停止日期(M_BC_Stop_manufacure__c)变化时
    // private static void FlgStopManufacure(List<Product2> newList,Map<Id, Product2> oldMap){
    //     if(newList != null){
    //         for(Product2 pts : newList){
    //             if(oldMap != null){
    //                 if(pts.M_BC_Stop_manufacure__c != null && oldMap.get(pts.Id).M_BC_Stop_manufacure__c == null){
    //                     pts.ProductMonthlySalesFlag__c = true;
    //                 }
    //                 if(pts.M_BC_Stop_manufacure__c != null && oldMap.get(pts.Id).M_BC_Stop_manufacure__c != null && pts.M_BC_Stop_manufacure__c != oldMap.get(pts.Id).M_BC_Stop_manufacure__c){
    //                     pts.ProductMonthlySalesFlag__c = true;
    //                 }
    //                 if(pts.M_BC_Stop_manufacure__c == null && oldMap.get(pts.Id).M_BC_Stop_manufacure__c != null){
    //                     pts.ProductMonthlySalesFlag__c = false;
    //                     pts.Estimated_ConsumptionDueDate__c = null;
    //                 }
    //             }
    //         }
    //     }
        
    // }
    //SFDC停止预警  lt  20211015 add end
    private  void FlgStopManufacure(){
        for(Product2 pts : newList){

            Product2 oldPts = oldMap.get(pts.Id);

            if(pts.M_BC_Stop_manufacure__c  != oldPts.M_BC_Stop_manufacure__c){
                pts.ProductMonthlySalesFlag__c = true;
                if (pts.M_BC_Stop_manufacure__c == null) {
                    pts.ProductMonthlySalesFlag__c = false;
                    pts.Estimated_ConsumptionDueDate__c = null;    
                }
            }

            if(pts.SFDA_Status__c == '停止' && oldPts.SFDA_Status__c != '停止'){
                pts.Estimated_ConsumptionDueDate__c = null;
            }
        }
    }

}