@RestResource(urlMapping = '/SBGITM/*')
global with sharing class SBGITMRest  {

    //
    //该接口20200320下班之后正式废弃，特此标注，改用新接口-SBGITMRestNew
    //
    //
    
    global class GeDatasRest {
        public GeDatas GeDatas;
    }

    global class GeDatas {
        public NFMUtil.Monitoring Monitoring;
        public SBGITMRest.GeData[] GeData;
    }
    global class GeData {
        public String  ProductCode;
        public String  ProductDescription;
        public String  ProductStatus;
        public String  EffectiveDateTo;
        public String  Other1;
        public String  Other2;
        public String  Other3;

        //20190717 SSBG_CBPR
        public String Exemption;//豁免标识
        public String IsRadiant;//辐射标识
        public String NMPAStatus;//首营物料状态
        public String StatusEffectiveDateFrom;//有效期开始日
        //20190717 SSBG_CBPR
        public String ZCHG_STATUS;
    }

    @HttpPost
    global static void execute() {

        // 取得接口传输内容
        String strData = RestContext.request.requestBody.toString();
        GeDatasRest ges = (GeDatasRest) JSON.deserializeStrict(strData, GeDatasRest.class);

        if (ges == null ) {
            return;
        }

        NFMUtil.Monitoring Monitoring = ges.GeDatas.Monitoring;
        if (Monitoring == null) {
            return;
        }

        BatchIF_Log__c rowData = NFMUtil.saveRowData(Monitoring, 'SBGITM', ges.GeDatas.GeData);
        if (String.isBlank(rowData.Log__c) == false) {
            executefuture(rowData.Id);
        }

        // JSONを戻す
        RestResponse res = RestContext.response;
        res.addHeader('Content-Type', 'application/json');
        res.statusCode = 200;
        //String jsonResponse = '{"status": "Success", "Message":'  + gedata + '}';
        String jsonResponse = '{"status": "Success", "Message":""}';
        res.responseBody = blob.valueOf(jsonResponse);
        return;
    }

    @future
    global static void executefuture(String rowData_Id) {
        main(rowData_Id);
    }

    global static void main(String rowData_Id) {

        //Integer batch_retry_max_cnt = Integer.valueOf(System.Label.batch_retry_max_cnt);
        //BatchIF_Log__c rowData = [Select Id, Name, Log__c, ErrorLog__c, Log2__c, Log3__c, Log4__c, Log5__c, Log6__c, Log7__c, Log8__c, Log9__c, Log10__c, Log11__c, Log12__c, MessageGroupNumber__c, retry_cnt__c from BatchIF_Log__c where RowDataFlg__c = true and Id = :rowData_Id];
        //String logstr = rowData.MessageGroupNumber__c + ' start\n';
        //BatchIF_Log__c iflog = new BatchIF_Log__c();
        //iflog.Type__c = 'SBGITM';
        //iflog.MessageGroupNumber__c = rowData.MessageGroupNumber__c;
        //iflog.Log__c = logstr;
        //iflog.ErrorLog__c = '';
        //insert iflog;
        //String rowDataStr = NFMUtil.getRowDataStr(rowData);
        //List<GeData> itemMasterList = (List<GeData>) JSON.deserialize(rowDataStr, List<GeData>.class);
        //if (itemMasterList == null || itemMasterList.size() == 0) {
        //    return;
        //}

        //Savepoint sp = Database.setSavepoint();
        //try {
        //    // 更新対応配列とMapなどをセット
        //    List<String> productCodeList = new List<String>();
        //    for (GeData GeData : itemMasterList) {
        //        if (GeData.ProductCode == null || GeData.ProductCode == '') {
        //            // 必須項目がない場合、処理と飛ばす
        //            continue;
        //        }
        //        productCodeList.add(GeData.ProductCode);
        //    }
        //    List<Product2> prdList = [select Id,
        //                              ProductCode,
        //                              Description,
        //                              ProductStatus__c,
        //                              EffectiveDateTo__c,
        //                              NMPAStatus_one__c, MaterialStatus_one_Start__c, MaterialStatus_one_End__c,
        //                              NMPAStatus_two__c, MaterialStatus_two_Start__c, MaterialStatus_two_End__c
        //                              from Product2
        //                              where ProductModels__c = false and ProductCode in :productCodeList];
        //    Map<String, Product2> prdsMap = new Map<String, Product2>();
        //    for (Product2 prd : prdList) {
        //        prdsMap.put(prd.ProductCode, prd);
        //    }

        //    // 更新対応配列をセット
        //    prdList = new List<Product2>();
        //    Map<String, Product2> prdUpdateMap = new Map<String, Product2>();
        //    for (GeData GeData : itemMasterList) {
        //        if (GeData.ProductCode == null || GeData.ProductCode == '') {
        //            // 必須項目がない場合、処理と飛ばす
        //            iflog.ErrorLog__c += 'MaterialNumber is required\n';
        //            continue;
        //        }

        //        if (String.isBlank(GeData.ProductDescription)) {
        //            iflog.ErrorLog__c += 'Description is required:' + GeData.ProductCode  + ' \n';
        //            continue;
        //        }

        //        Product2 prd = prdsMap.get(GeData.ProductCode);
        //        String prdName = null;

        //        if (prd == null) {
        //            prd = new Product2();
        //        }

        //        // 項目転送のセット
        //        prd.ProductCode        = GeData.ProductCode;
        //        prd.IsActive = true;
        //        if (prdUpdateMap.get(prd.ProductCode) == null) {
        //            prdList.add(prd);
        //            prdUpdateMap.put(prd.ProductCode, prd);
        //            //logstr += GeData.MaterialNumber + ' ';               // 価格表のところまとめてlogを出す
        //        } else {
        //            prd = prdUpdateMap.get(prd.ProductCode);
        //        }


        //        //SSBG-CBPR
        //        // 中文名称が転送してきた場合
        //        prdName = GeData.ProductDescription;
        //        if (prdName != null) {

        //            //SSBG-CBPR
        //            Date dateFrom = '00000000'.equals(GeData.StatusEffectiveDateFrom) ? Date.today() : NFMUtil.parseStr2Date(GeData.StatusEffectiveDateFrom, false);
        //            Date oneStart = prd.MaterialStatus_one_Start__c;
        //            Date oneEnd = prd.MaterialStatus_one_End__c;
        //            Date twoStart = prd.MaterialStatus_two_Start__c;
        //            Date twoEnd = prd.MaterialStatus_two_End__c ;

        //            String campState = String.isBlank( GeData.NMPAStatus) ? 'Z1' : GeData.NMPAStatus;
        //            if (prd == null) {

        //                prd.NMPAStatus_one__c = campState;
        //                prd.MaterialStatus_one_Start__c = dateFrom;
        //                prd.MaterialStatus_one_End__c = NFMUtil.parseStr2Date('40001231', true);
        //            } else if ( oneStart == null || oneEnd < Date.today() || oneStart == dateFrom) {

        //                if (twoEnd != null) {
        //                    prd.MaterialStatus_two_End__c = dateFrom.addDays(-1);
        //                }
        //                prd.NMPAStatus_one__c = campState;
        //                prd.MaterialStatus_one_Start__c = dateFrom;
        //                prd.MaterialStatus_one_End__c = NFMUtil.parseStr2Date('40001231', true);
        //            } else if (twoStart == null || twoEnd < Date.today() || twoStart == dateFrom) {

        //                prd.NMPAStatus_two__c = campState;
        //                prd.MaterialStatus_one_End__c = dateFrom.addDays(-1);
        //                prd.MaterialStatus_two_Start__c = dateFrom;
        //                prd.MaterialStatus_two_End__c = NFMUtil.parseStr2Date('40001231', true);
        //            } else {

        //                if ( (oneStart <= Date.today()) && (Date.today() <= oneEnd)) {
        //                    prd.MaterialStatus_one_End__c = dateFrom.addDays(-1);
        //                    prd.NMPAStatus_two__c = campState;
        //                    prd.MaterialStatus_two_Start__c = dateFrom;
        //                    prd.MaterialStatus_two_End__c = NFMUtil.parseStr2Date('40001231', true);
        //                } else if ( (twoStart <= Date.today()) && (Date.today() <= twoEnd)) {
        //                    prd.MaterialStatus_two_End__c = dateFrom.addDays(-1);
        //                    prd.NMPAStatus_one__c = campState;
        //                    prd.MaterialStatus_one_Start__c = dateFrom;
        //                    prd.MaterialStatus_one_End__c = NFMUtil.parseStr2Date('40001231', true);
        //                }
        //            }


        //            prd.If_Exempt_Product__c = GeData.Exemption == '1' ? true : false;
        //            prd.If_Radiation_Product__c = GeData.IsRadiant == '1' ? true : false;

        //            //SSBG-CBPR


        //            // デフォルト値
        //            prd.Name = prdName;
        //            String alternative_Products = null;
        //            String nDM_Model_No = null;
        //            prd.Name = prdName.trim();

        //            // 型番:代替品::中文名称 のパターン
        //            //Pattern pt = Pattern.compile('(.*):(.*)::(.*)');
        //            //Matcher mc = pt.matcher(prdName);
        //            //if (mc.matches() == false
        //            //        && ((prd.Name.indexOf(':') >= 0 && prd.Name.indexOf(':') != prd.Name.indexOf('::'))
        //            //                || (prd.Name.indexOf('：') >= 0 && prd.Name.indexOf('：') != prd.Name.indexOf('：：'))
        //            //           )
        //            //) {
        //            //    // 型番::中文名称 のパターン
        //            //    pt = Pattern.compile('(.*):(.*)');
        //            //    mc = pt.matcher(prdName);
        //            //    if (mc.matches()) {
        //            //        nDM_Model_No = mc.group(1).trim();
        //            //        prd.Name = mc.group(2).trim();
        //            //        prd.Product_ECCode__c = nDM_Model_No;
        //            //        System.debug('mc is1' + mc);
        //            //        System.debug('prdName is1' + prdName);
        //            //        System.debug('nDM_Model_No is1' + nDM_Model_No);
        //            //    } else {
        //            //        pt = Pattern.compile('(.*)：(.*)');
        //            //        mc = pt.matcher(prdName);
        //            //        if (mc.matches()) {
        //            //            nDM_Model_No = mc.group(1).trim();
        //            //            prd.Name =  mc.group(2).trim();
        //            //            prd.Product_ECCode__c = nDM_Model_No;
        //            //            System.debug('mc is2' + mc);
        //            //            System.debug('prdName is2' + prdName);
        //            //            System.debug('nDM_Model_No is2' + nDM_Model_No);
        //            //        }
        //            //    }
        //            //}

        //            if (prdName.indexOf(':') < 0 && prdName.indexOf('：') < 0) {
        //                prd.Product_ECCode__c = GeData.ProductCode;
        //            } else {
        //                Integer max = -1;
        //                Integer min = 100000;
        //                Integer starh = prdName.indexOf(':');
        //                if (starh >= 0) {
        //                    if (min > starh) {
        //                        min = starh;
        //                    }
        //                }
        //                Integer stara = prdName.indexOf('：');
        //                if (stara >= 0) {
        //                    if (min > stara) {
        //                        min = stara;
        //                    }
        //                }
        //                Integer endh = prdName.lastIndexOf(':');
        //                if (endh >= 0) {
        //                    if (max < endh) {
        //                        max = endh;
        //                    }
        //                }
        //                Integer enda = prdName.lastIndexOf('：');
        //                if (enda >= 0) {
        //                    if (max < enda) {
        //                        max = enda;
        //                    }
        //                }
        //                prd.Product_ECCode__c = prdName.substring(0, min);
        //                prd.Name =  prdName.substring(max + 1, prdName.length());
        //            }
        //            if (GeData.ProductCode != null) {
        //                prd.ProductCode = GeData.ProductCode;
        //            }
        //            if (GeData.ProductDescription != null) {
        //                prd.Description = GeData.ProductDescription;
        //            }
        //            if (GeData.ProductStatus != null) {
        //                prd.ProductStatus__c = GeData.ProductStatus;
        //            }
        //            if (GeData.EffectiveDateTo != null) {
        //                prd.EffectiveDateTo__c = NFMUtil.parseStr2Date(GeData.EffectiveDateTo, true);
        //            }


        //            //SSBG-CBPR
        //        }
        //    }
        //    if (prdList.size() > 0) {
        //        logstr += 'Execute Record:' + prdList.size() + '\n';
        //        upsert prdList;
        //        // PricebookEntryにデータがない場合insertする、CNYとUSDのみ
        //        Pricebook2 pricebook = ControllerUtil.getStandardPricebook();

        //        String pricebookId = pricebook.Id;
        //        List<PricebookEntry> pbeList = [Select Product2Id, CurrencyIsoCode, UnitPrice, Pricebook2Id From PricebookEntry where Product2Id in: prdList and Pricebook2Id = :pricebookId order by Product2Id, CurrencyIsoCode];
        //        List<PricebookEntry> pbeInsertList = new List<PricebookEntry>();
        //        Map<String, PricebookEntry> rmbMap = new Map<String, PricebookEntry>();
        //        Map<String, PricebookEntry> usdMap = new Map<String, PricebookEntry>();
        //        for (PricebookEntry pbe : pbeList) {
        //            if (pbe.CurrencyIsoCode == 'CNY') {
        //                rmbMap.put(pbe.Product2Id, pbe);
        //            } else if (pbe.CurrencyIsoCode == 'USD') {
        //                usdMap.put(pbe.Product2Id, pbe);
        //            }
        //        }
        //        for (Product2 prd : prdList) {
        //            logstr += prd.ProductCode;
        //            if (rmbMap.get(prd.Id) == null) {
        //                PricebookEntry pbe = new PricebookEntry();
        //                pbe.Pricebook2Id    = pricebookId;
        //                pbe.Product2Id      = prd.Id;
        //                pbe.CurrencyIsoCode = 'CNY';
        //                pbe.UnitPrice       = 0;
        //                pbe.IsActive        = prd.IsActive;
        //                pbeInsertList.add(pbe);
        //                logstr += ' add(CNY_0)';
        //            }
        //            if (usdMap.get(prd.Id) == null) {
        //                PricebookEntry pbe = new PricebookEntry();
        //                pbe.Pricebook2Id    = pricebookId;
        //                pbe.Product2Id      = prd.Id;
        //                pbe.CurrencyIsoCode = 'USD';
        //                pbe.UnitPrice       = 0;
        //                pbe.IsActive        = prd.IsActive;
        //                pbeInsertList.add(pbe);
        //                logstr += ' add(USD_0)';
        //            }
        //            logstr += ' ';
        //        }
        //        if (pbeInsertList.size() > 0) {
        //            logstr += 'Execute Record2:' + pbeInsertList.size() + '\n';
        //            insert pbeInsertList;
        //        }
        //    }
        //    logstr += '\nend';
        //    rowData.retry_cnt__c = 0;
        //} catch (Exception ex) {
        //    // エラーが発生した場合
        //    Database.rollback(sp);
        //    System.debug(Logginglevel.ERROR, 'SBGITM_' + rowData.MessageGroupNumber__c + ':' + ex.getMessage());
        //    System.debug(Logginglevel.ERROR, 'SBGITM_' + rowData.MessageGroupNumber__c + ':' + ex.getStackTraceString());
        //    logstr += '\n' + ex.getMessage();
        //    iflog.ErrorLog__c = ex.getMessage() + '\n' + ex.getStackTraceString() + '\n' + iflog.ErrorLog__c;
        //    if (rowData.retry_cnt__c == null) rowData.retry_cnt__c = 0;
        //    if (rowData.retry_cnt__c < batch_retry_max_cnt) {
        //        rowData.retry_cnt__c++;
        //        LogAutoSendSchedule.assignOneMinute();
        //    }
        //    if (rowData.retry_cnt__c >= batch_retry_max_cnt) {
        //        rowData.ErrorLog__c = ex.getMessage() + '\n' + ex.getStackTraceString() + '\n' + rowData.ErrorLog__c + '错误次数已经超过自动收信设定的最大次数，请手动收信';
        //    }
        //}
        //update rowData;
        //iflog.Log__c = logstr;
        //if (iflog.Log__c.length() > 131072) {
        //    iflog.Log__c = iflog.Log__c.subString(0, 131065) + ' ...';
        //}
        //if (iflog.ErrorLog__c.length() > 32768) {
        //    iflog.ErrorLog__c = iflog.ErrorLog__c.subString(0, 32760) + ' ...';
        //}
        //update iflog;

    }

}