@RestResource(urlMapping='/SBG017/*')
global with sharing class SBG017Rest  {

    global class GeDatasRest {
        public GeDatas GeDatas;
    }

    global class GeDatas {
        public NFMUtil.Monitoring Monitoring;
        public SBG017Rest.GeData[] GeData;
    }
    global class GeData {
        public String  OpportunityCode;
        public String  SAPQuotationCode;
        public String  StockAnswer;
        public String  Other1;
        public String  Other2;
        public String  Other3;
    }
    
    @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, 'SBG017', 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 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 = 'SBG017';
        iflog.MessageGroupNumber__c = rowData.MessageGroupNumber__c;
        iflog.Log__c = logstr;
        iflog.ErrorLog__c = '';
        insert iflog;
        String rowDataStr = NFMUtil.getRowDataStr(rowData);
        List<GeData> achievementList = (List<GeData>) JSON.deserialize(rowDataStr, List<GeData>.class);
        if (achievementList == null || achievementList.size() == 0) {
            return;
        }

        Savepoint sp = Database.setSavepoint();
        try {
            // 更新対応配列とMapなどをセット
            List<String> oppNoList = new List<String>();
            for (GeData GeData : achievementList) {
                if (GeData.OpportunityCode == null || GeData.OpportunityCode == '' ||
                    GeData.SAPQuotationCode == null || GeData.SAPQuotationCode == '' ||
                    GeData.StockAnswer == null || GeData.StockAnswer == ''
                ) {
                    // 必須項目がない場合、処理と飛ばす
                    continue;
                }
                oppNoList.add(GeData.OpportunityCode);
            }
            List<Opportunity> oppList = [select Id, SAP_QuotationCode__c,InquiryNumber__c,Stock_Answer__c
                                           from Opportunity
                                          where InquiryNumber__c in :oppNoList];
            Map<String, Opportunity> oppsMap = new Map<String, Opportunity>();
            for (Opportunity opp : oppList) {
                oppsMap.put(opp.InquiryNumber__c, opp);
            }

            // 更新対応配列をセット
            Map<Id, Opportunity> oppUpdateMap = new Map<Id, Opportunity>();
            for (GeData GeData : achievementList) {
                if (GeData.OpportunityCode == null || GeData.OpportunityCode == '') {
                    // 必須項目がない場合、処理と飛ばす
                    iflog.ErrorLog__c += 'OpportunityCode is required\n';
                    continue;
                }
                if (GeData.SAPQuotationCode == null || GeData.SAPQuotationCode == '') {
                    // 必須項目がない場合、処理と飛ばす
                    iflog.ErrorLog__c += 'SAPQuotationCode is required\n';
                    continue;
                }
                if (GeData.StockAnswer == null || GeData.StockAnswer == '') {
                    // 必須項目がない場合、処理と飛ばす
                    iflog.ErrorLog__c += 'StockAnswer is required\n';
                    continue;
                }
                Opportunity opp = oppsMap.get(GeData.OpportunityCode);
                if (opp == null) {
                    // 更新対象商談がない場合
                    iflog.ErrorLog__c += '[' + GeData.OpportunityCode + ']Opportunity[' + GeData.SAPQuotationCode + ']NotExist\n';
                    continue;
                }
                // 項目セット
                //opp.InquiryNumber__c = GeData.OpportunityCode;
                opp.SAP_QuotationCode__c = GeData.SAPQuotationCode;
                opp.Stock_Answer__c            = GeData.StockAnswer;

                oppUpdateMap.put(opp.Id, opp);
            }
            if (oppUpdateMap.size() > 0) {
                update oppUpdateMap.values();
            }
            logstr += '\nend';
            rowData.retry_cnt__c=0;
        } catch(Exception ex) {
            // エラーが発生した場合
            Database.rollback(sp);
            System.debug(Logginglevel.ERROR, 'SBG017_' + rowData.MessageGroupNumber__c + ':' + ex.getMessage());
            System.debug(Logginglevel.ERROR, 'SBG017_' + 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;
    }
}