/**
 * wangweipeng     2021/09/02
 * update          2021/11/10
 * 用于把ods__c表的数据同步到 user表中
 */
public with sharing class UpsertContactHandler {

    //新增或修改user表数据
    public static void UpsertContact(List<ODS__c> newList, Map<Id, ODS__c> newMap, List<ODS__c> oldList, Map<Id, ODS__c> oldMap){
        Map<Id,ODS__c> updateMap = new Map<Id,ODS__c>();
        if(newList != null && newList.size() > 0){
            //用于存放触发trigger的ods数据的员工编号
            List<String> employeeNoList = new List<String>();
            //获取自定义标签，自己定义，用来空更新数据或处理历史数据
            Integer buffer = Integer.valueOf(System.Label.ODS_Null_Update_Sign);
            for (ODS__c os : newList) {
                if(String.isNotBlank(os.Employee_No__c) && os.Job_Type__c != '劳务-派遣' && os.Job_Type__c != '劳务-临时' && os.Job_Type__c != '无' && String.isNotBlank(os.Job_Type__c) && String.isNotBlank(os.Stay_or_not__c) && os.Stay_or_not__c != '待入职'){
                    //如果为update，那么判断值是否发生变化
                    //判断值数据发生变化
                    if(Trigger.isUpdate){
                        //统括本部、本部、部、课、员工编码、入职日期、电子邮件、手机号码、职位、职种、负责产品（主）、销售工作内容、工作地、在职/已离职、离职日期
                        //以上字段的值是否发生变换
                        //如果发生变化，那么更新user表数据，user表更新contact表数据
                        if(buffer == 1 || os.Category3__c != oldMap.get(os.id).Category3__c || os.Category4__c != oldMap.get(os.id).Category4__c 
                            || os.Category5__c != oldMap.get(os.id).Category5__c || os.Category6__c != oldMap.get(os.id).Category6__c 
                            || os.Employee_No__c != oldMap.get(os.id).Employee_No__c || os.Hire_Date__c != oldMap.get(os.id).Hire_Date__c 
                            || os.Email__c != oldMap.get(os.id).Email__c || os.MobilePhone__c != oldMap.get(os.id).MobilePhone__c 
                            || os.Post__c != oldMap.get(os.id).Post__c || os.Job_Category__c != oldMap.get(os.id).Job_Category__c 
                            || os.Product_specialist_incharge_product__c != oldMap.get(os.id).Product_specialist_incharge_product__c 
                            || os.Sales_Speciality__c != oldMap.get(os.id).Sales_Speciality__c || os.Work_Location__c != oldMap.get(os.id).Work_Location__c 
                            || os.Stay_or_not__c != oldMap.get(os.id).Stay_or_not__c || os.LeaveDate__c != oldMap.get(os.id).LeaveDate__c )
                        {
                            employeeNoList.add(os.Employee_No__c.trim());
                        }
                    }else{
                        employeeNoList.add(os.Employee_No__c.trim());
                    }
                }
            }

            //判断是否有需要更新的数据
            if(employeeNoList.size() > 0){
                //存放需要修改的user表数据
                List<User> updateUserDate = new List<User>();
                //存放需要新增的user数据
                List<User> insertUserDate = new List<User>();
                //查询user
                List<User> userList = [SELECT ID,NAME,Group_sales_dept__c,Dept__c,Category5__c,Category6__c,Employee_No__c,Hire_Date__c,Email,Mobile_Phone__c,Post__c,Job_Category__c,Product_specialist_incharge_product__c,Sales_Speciality__c,Work_Location__c,Stay_or_not__c,QuitDate__c,IsMEBG__c FROM USER WHERE Employee_No__c IN : employeeNoList and Employee_No__c != null ];

                //以下根据ods传过来的数据来判断user表到底是update还是insert
                if(userList != null && userList.size() > 0){
                    for(ODS__c osc : newList){
                        if(String.isNotBlank(osc.Employee_No__c) && osc.Job_Type__c != '劳务-派遣' && osc.Job_Type__c != '劳务-临时' && osc.Job_Type__c != '无' && String.isNotBlank(osc.Job_Type__c) && String.isNotBlank(osc.Stay_or_not__c) && osc.Stay_or_not__c != '待入职'){
                            User userData = new User();
                            boolean falg = true;
                            //循环user表
                            for(User us : userList){
                                //判断员工编码在user表中是否存在
                                if(osc.Employee_No__c.trim() == us.Employee_No__c.trim()){
                                    userData = setUserData(osc,us);
                                    if(String.isNotBlank(userData.Employee_No__c)){
                                        updateUserDate.add(userData);
                                    }
                                    falg = false;
                                    break;
                                }
                            }
                            //判断user表中是否有这个员工编码，如果没有，那么就需要新增user
                            if(falg){
                                userData = setUserData(osc,new User());
                                if(String.isNotBlank(userData.Employee_No__c)){
                                    insertUserDate.add(userData);
                                }
                            }
                        }
                    }
                }else{
                    //防止直接没有在user查到数据
                    for(ODS__c osc : newList){
                        if(String.isNotBlank(osc.Employee_No__c) && osc.Job_Type__c != '劳务-派遣' && osc.Job_Type__c != '劳务-临时' && osc.Job_Type__c != '无' && String.isNotBlank(osc.Job_Type__c) && String.isNotBlank(osc.Stay_or_not__c) && osc.Stay_or_not__c != '待入职'){
                            User userData = setUserData(osc,new User());
                            if(String.isNotBlank(userData.Employee_No__c)){
                                insertUserDate.add(userData);
                            }
                        }
                    }
                }

                Savepoint sp = Database.setSavepoint();
                try{
                    StaticParameter.EscapeContactInsUpdUser = true;
                    System.debug('**1*****************'+updateUserDate.size());
                    //修改用户信息
                    if(updateUserDate.size() > 0){
                        update updateUserDate;
                        /*Database.SaveResult[] lsr = Database.update(updateUserDate, false);
                        if(lsr.size() > 0){
                            for (Integer tIdx = 0; tIdx < lsr.size(); tIdx++) {
                                Database.SaveResult sr = lsr[tIdx];
                                if (!sr.isSuccess()) {
                                    System.debug('-------------ods数据保存到user表时修改报错：'+updateUserDate[tIdx].Employee_No__c+'。报错日志为：' + sr.getErrors()[0]);
                                }
                            }
                        }*/
                    }
                    //新增用户信息
                    if(insertUserDate.size() > 0){
                        insert insertUserDate;
                        /*Database.SaveResult[] lsr2 = Database.insert(insertUserDate, false);
                        for (Integer tIdx = 0; tIdx < lsr2.size(); tIdx++) {
                            Database.SaveResult sr = lsr2[tIdx];
                            if (!sr.isSuccess()) {
                                System.debug('-------------ods数据保存到user表时新增报错：'+updateUserDate[tIdx].Employee_No__c+'。报错日志为：' + sr.getErrors()[0]);
                            }
                        }*/
                    }

                    StaticParameter.EscapeContactInsUpdUser = false;
                }catch(exception e){
                    //失败提示
                    System.debug('----------------------出错了'+e.getMessage());
                     newList[0].addError( e.getMessage());
                     //ApexPages.addMessages(e);
                    Database.rollback(sp);
                }
            }
        }
    }

    /**
     *   ODS__c           USER
     * Category3        统括本部 
     * Category4        本部
     * Category5        部
     * Category6        课
     * Employee_No      员工编码
     * Hire_Date        入职日期
     * FirstName   
     * LastName    
     * Name             别名
     * Email            电子邮件
     * MobilePhone      手机号码
     * Post             职位
     * Job_Category     职种
     * Job_Type    
     * Product_specialist_incharge_product 负责产品（主）
     * Sales_Speciality     销售工作内容
     * Work_Location        工作地
     * Stay_or_not          在职/已离职
     * LeaveDate            离职日期
    */
    public static user setUserData(ODS__c odsc,User u){
        User userData = new User();
        //判断是否要新增
        //如果为空，那么就需要新增，不为空更新
        if(String.isNotBlank(u.Employee_No__c)){//修改user表数据
            //判断值是否发生变化
            /*if(odsc.Category3__c != u.Group_sales_dept__c || odsc.Category4__c != u.Dept__c || odsc.Category5__c != u.Category5__c 
                 || odsc.Category6__c != u.Category6__c || odsc.Employee_No__c != u.Employee_No__c || odsc.Hire_Date__c != u.Hire_Date__c 
                 || odsc.Email__c != u.Email || odsc.MobilePhone__c != u.Mobile_Phone__c || odsc.Post__c != u.Post__c 
                 || odsc.Job_Category__c != u.Job_Category__c || odsc.Product_specialist_incharge_product__c != u.Product_specialist_incharge_product__c 
                 || odsc.Sales_Speciality__c != u.Sales_Speciality__c || odsc.Work_Location__c != u.Work_Location__c 
                 || odsc.Stay_or_not__c != u.Stay_or_not__c || odsc.LeaveDate__c != u.QuitDate__c || !u.IsMEBG__c)
            {
                userData.Group_sales_dept__c = odsc.Category3__c;//统括本部
                userData.Dept__c = odsc.Category4__c;//本部
                userData.Category5__c = odsc.Category5__c;//部
                userData.Category6__c = odsc.Category6__c;//课
                userData.Employee_No__c = odsc.Employee_No__c;//员工编码
                userData.Hire_Date__c = odsc.Hire_Date__c;//入职日期
                //userData.Email = odsc.Email__c;//电子邮件
                userData.Mobile_Phone__c = odsc.MobilePhone__c;//手机号码
                userData.Post__c = odsc.Post__c;//职位
                userData.Job_Category__c = odsc.Job_Category__c;//职种
                userData.Product_specialist_incharge_product__c = odsc.Product_specialist_incharge_product__c;//负责产品（主）
                userData.Sales_Speciality__c = odsc.Sales_Speciality__c;//销售工作内容
                userData.Work_Location__c = odsc.Work_Location__c;//工作地
                userData.Stay_or_not__c = odsc.Stay_or_not__c;//在职/已离职
                userData.QuitDate__c = odsc.LeaveDate__c;//离职日期
                //userData.Alias = odsc.Name__c;//别名
                userData.Username_Proxy__c = odsc.Email__c;//用户名
                userData.IsMEBG__c=true;//是否MEBG
                userData.id = u.id;
            }*/

            userData.Group_sales_dept__c = odsc.Category3__c;//统括本部
            userData.Dept__c = odsc.Category4__c;//本部
            userData.Category5__c = odsc.Category5__c;//部
            userData.Category6__c = odsc.Category6__c;//课
            userData.Employee_No__c = odsc.Employee_No__c;//员工编码
            userData.Hire_Date__c = odsc.Hire_Date__c;//入职日期
            //userData.Email = odsc.Email__c;//电子邮件
            userData.Mobile_Phone__c = odsc.MobilePhone__c;//手机号码
            userData.Post__c = odsc.Post__c;//职位
            userData.Job_Category__c = odsc.Job_Category__c;//职种
            userData.Product_specialist_incharge_product__c = odsc.Product_specialist_incharge_product__c;//负责产品（主）
            userData.Sales_Speciality__c = odsc.Sales_Speciality__c;//销售工作内容
            userData.Work_Location__c = odsc.Work_Location__c;//工作地
            userData.Stay_or_not__c = odsc.Stay_or_not__c;//在职/已离职
            userData.QuitDate__c = odsc.LeaveDate__c;//离职日期
            //userData.Alias = odsc.Name__c;//别名
            userData.Username_Proxy__c = odsc.Email__c;//用户名
            userData.IsMEBG__c=true;//是否MEBG
            userData.id = u.id;

        }else{//新增user
            
            userData.Group_sales_dept__c = odsc.Category3__c;//统括本部
            userData.Dept__c = odsc.Category4__c;//本部
            userData.Category5__c = odsc.Category5__c;//部
            userData.Category6__c = odsc.Category6__c;//课
            userData.Employee_No__c = odsc.Employee_No__c;//员工编码
            userData.Hire_Date__c = odsc.Hire_Date__c;//入职日期
            userData.Email_Proxy__c = odsc.Email__c;//电子邮件,新建时，填写电子邮件
            userData.Username_Proxy__c = odsc.Employee_No__c+odsc.FirstName__c + odsc.LastName__c+'@prec-tech1.com';//用户名
            userData.Mobile_Phone__c = odsc.MobilePhone__c;//手机号码
            userData.Post__c = odsc.Post__c;//职位
            userData.Job_Category__c = odsc.Job_Category__c;//职种
            userData.Product_specialist_incharge_product__c = odsc.Product_specialist_incharge_product__c;//负责产品（主）
            userData.Sales_Speciality__c = odsc.Sales_Speciality__c;//销售工作内容
            userData.Work_Location__c = odsc.Work_Location__c;//工作地
            userData.Stay_or_not__c = odsc.Stay_or_not__c;//在职/已离职
            userData.QuitDate__c = odsc.LeaveDate__c;//离职日期
            userData.IsMEBG__c=true;//是否MEBG
            //由于ods的姓和名都是拼音，所以获取name__c的值，并且首字母第一位为姓，其余为名
            if(String.isNotBlank(odsc.Name__c)){
                if(odsc.Name__c.length() > 1){
                    userData.LastName = odsc.Name__c.substring(0,1);
                    userData.FirstName = odsc.Name__c.substring(1,odsc.Name__c.length());
                    userData.Alias = odsc.Name__c;
                }
            }
            
            //以下是系统默认
            userData.FederationIdentifier_Proxy__c = odsc.Employee_No__c + '@olympus.com.cn';
            userData.EmailEncodingKey = 'UTF-8';//电子邮件编码
            userData.IsActive_Proxy__c = false;
            userData.TimeZoneSidKey = 'Asia/Shanghai';//时区
            userData.LocaleSidKey = 'ja_JP';//区域
            userData.LanguageLocaleKey = 'zh_CN';//语言
            //userData.DefaultCurrencyIsoCode = 'CNY';//默认币种 ISO 代码
            //userData.CurrencyIsoCode = 'CNY';//信息币种
            //默认ods创建的user用户的简档为  999_看不见Profile
            userData.Profileid_Proxy__c = '00e10000000dFYJ';
        }
        return userData;

        /*ctc.ODS__c = odsc.Id;
        ctc.Isactive__c = '有效';
        ctc.AccountId = '0011000000eTSPC';//Olympus社内 其他 社内用户
        ctc.RecordTypeId = Schema.SObjectType.Contact.getRecordTypeInfosByDeveloperName().get('Internal_staff').getRecordTypeId();
        if(!''.equals(idStr)){
            ctc.Id = idStr;
        }
        return ctc;*/
    }
}