/**
 * @url:/services/apexrest/NFM704/execute
 * 
 */

@RestResource(urlMapping='/NFM704/*')
global with sharing class NFM704Rest {

    global class GeDatas {
        public NFMUtil.Monitoring Monitoring;
        public  GeData[] GeData;
    }

    public static final String LOG_TYPE = 'NFM704';

    global class GeData {
        public String StaffMCode;   //SFDC人员管理编码
        public String HospitalMCode;     //医院管理编码
        public String OfficeMCode;   //科室管理编码
        public String HcpNo;    //HPC编码
        public String HCPLevel; //HCP等级
        public String Name;    //姓名
        public String Mobile;   //电话
    }

    @HttpPost
    global static void doPost() {
        //取得接口传输内容
        String strData = RestContext.request.requestBody.toString();
        GeDatas ges = (GeDatas) JSON.deserializeStrict(strData, GeDatas.class);
    
        if(ges == null) {
            return;
        }

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

        BatchIF_Log__c rowData = NFMUtil.saveRowData(Monitoring, LOG_TYPE, ges.GeData);
        system.debug('String.isBlank(rowData.Log__c) == false?');
        if(String.isBlank(rowData.Log__c) == false){
            System.debug('进入if方法，成功调用executefuture');
            executefuture(rowData.Id);
        }

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

    }

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

    global static void main(String rowData_Id){

        String logstr = 'start\n';
        BatchIF_Log__c iflog = new BatchIF_Log__c();
        iflog.Type__c = LOG_TYPE;
        iflog.ErrorLog__c = '';
        iflog.Log__c = logstr;
        insert iflog;

        GeDatas gds = new GeDatas();
        gds.GeData = new List< GeData >();

        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 rowDataStr = NFMUtil.getRowDataStr(rowData);

        List < GeData > itemMasterList = (List < GeData > ) JSON.deserialize(rowDataStr, List < GeData > .class);
        logstr += '数据总数为：' + itemMasterList.size() + '\n';
        if (itemMasterList == null || itemMasterList.size() == 0) {
            return;
        }

        Savepoint sp = Database.setSavepoint();

        try{
            //管理编码List
            List<String> DoctorNoList = new List<String>();

            //待更新的客户人员List
            List<Contact> updateList = new List<Contact>();

            //科室编码List
            List<String> officeMCodeList = new List<String>();

            for(GeData ged : itemMasterList){
                String dataComplete = verify(ged);
                if (!String.isBlank(dataComplete)) {
                    logstr += dataComplete;
                    continue;
                }
                DoctorNoList.add(ged.StaffMCode);
                officeMCodeList.add(ged.OfficeMCode);
            }

            Map<String, Contact> conListMap = new Map<String, Contact>();
            List<Contact> conList = [select Id,
                                            CManageCode__c,     //人员管理编码
                                            Account.Hospital_Name__c,       //医院名称
                                            Account.Department_Name__c,       //科室名称
                                            Name,       //姓名
                                            Phone,      //电话
                                            HcpNo__c,       //HCP编码
                                            Isactive__c,    //是否有效
                                            UpdateStatus__c            //操作类型
                                            from Contact WHERE CManageCode__c IN:DoctorNoList order by AccountId];

            
            for(Contact con : conList ){
                conListMap.put(con.CManageCode__c, con);
            }

            //Management_Code__c
            List<Account> accList = [select Id, Name, Management_Code__c from Account where Management_Code__c in :officeMCodeList];

            Map<String, Account> accMap = new Map<String, Account>();

            for(Account acc : accList){
                accMap.put(acc.Management_Code__c, acc);
            }

            for( GeData ged : itemMasterList ){

                Contact con = new Contact();

                logstr += conListMap.get(ged.StaffMCode).Id;

                if(conListMap.containsKey(ged.StaffMCode)){

                    logstr += '已存在客户人员\n';
                    con.Id = conListMap.get(ged.StaffMCode).Id;

                }else {
                    logstr += '不存在的客户人员\n';
                }

                //AccountId
                if( accMap.get(ged.OfficeMCode) != null ){
                    con.AccountId = accMap.get(ged.OfficeMCode).Id;
                }else {
                    logstr += '当前科室id有误或不存在';
                }

                con.HcpNo__c = ged.HcpNo;
                con.HCPLevel__c = ged.HCPLevel;
                con.LastName = ged.Name;
                con.MobilePhone = ged.Mobile;

                conListMap.put(ged.StaffMCode, con);
                
            }

            if(conListMap.size() > 0 ){
                // Update updateList;
                UpSert conListMap.values();
            }

            rowData.retry_cnt__c = 0;
            logstr += '\nend';

        }catch (Exception ex) {
            Integer batch_retry_max_cnt = Integer.valueOf(System.Label.batch_retry_max_cnt);
            // エラーが発生した場合
            Database.rollback(sp);
            logstr += '\n' + ex.getMessage();
            iflog.ErrorLog__c = ex.getMessage() + '\n' + ex.getStackTraceString() + '\n' + iflog.ErrorLog__c;
            // 异常重发
            rowData = NFMUtil.LogAutoSend(rowData, ex, null);
        }
        iflog.Log__c = logstr;
        upsert iflog;
    }

    public static String verify(GeData ged){
        String result = '';

        if (ged.StaffMCode == null) {
            result += 'DataError: SFDC人员管理编码 [ StaffMCode ] is null!\n';
        }
        if (ged.HospitalMCode == null) {
            result += 'DataError: 医院管理编码 [ HospitalMCode ] is null!\n';
        }
        if (ged.OfficeMCode == null) {
            result += 'DataError: 科室管理编码 [ OfficeMCode ] is null!\n';
        }
        if (ged.HcpNo == null) {
            result += 'DataError: HCP编码 [ HcpNo ] is null!\n';
        }
        if (ged.HCPLevel == null) {
            result += 'DataError: HCP等级 [ HCPLevel ] is null!\n';
        }
        if (ged.Name == null) {
            result += 'DataError: 姓名 [ Name ] is null!\n';
        }
        if (ged.Mobile == null) {
            result += 'DataError: 电话 [ Mobile ] is null!\n';
        }

        return result;
    }

}