public with sharing class LexContractAuthorizeController {
    public LexContractAuthorizeController() {
    }
    @AuraEnabled
    public static Opportunity init(String recordId){
    	try{
    		Opportunity item=[select 
    		 id,Estimation_Decision__c,Contract_DB_complite_day__c,Contract_Authorize__c,Contract_Authorize_Lock__c,If_Need_Authorize__c,
    		 Authorized_DB_No__c,SPO_URL__c,Estimation_No__c,Closing_Bid_Date__c,Bid_Date__c,
    		 Cnt_Lost_cancel_Draft__c,Cnt_Lost_cancel_report__c,IF_Submit__c,Agency1__c,Trade__c,Sales_Root__c,Is_Corrosion__c,AccDealerBlacklist__c,
             Agency2__c,Hospital__c,OwnerId,Sales_assistant_name_text__c
    		 from Opportunity
    		 where id = :recordId];
    		return item;

    	}catch(Exception e){
    		System.debug('LexStockCancelController init error: '+e.getMessage());
    	}
    	return null;
    }
    //贸易合规 20230307 you start
    //营业拦截提醒
    @AuraEnabled
    public static Boolean accSendEmail(String  AccDealerBlacklist,String accname,String angency1,String angency2,String ownerids,String ddid,String oppid) {
      //发送邮件
        List<Messaging.SingleEmailMessage> sendMails = new List<Messaging.SingleEmailMessage>();
        List<String>  MailsList = new List<String>();
        List<String> userIdList = new List<String>();
        if(String.isNotBlank(ownerids)){
            userIdList.add(ownerids);
        }
        if(String.isNotBlank(ddid)){
            userIdList.add(ddid);
        }
         //询价所有人，产品担当，发邮件
        List<User> UsrList = [SELECT email FROM user WHERE id in :userIdList]; 
        //获取各个用户的email
        for (User u : UsrList){
            MailsList.add(u.email);
        }
        system.debug('111===:'+MailsList);
        if (MailsList!=null&&MailsList.size()>0){
            String title = '';
            String body = '';
            title = ' 新建询价医院/经销商涉及黑名单';
            if(AccDealerBlacklist=='123'){
                body += '黑名单的客户为：' + accname+ '<br/>';
                body += '黑名单的经销商1为：' + angency1+ '<br/>';
                body += '黑名单的经销商2为：' + angency2+ '<br/>';
            }else if(AccDealerBlacklist=='12'){
                body += '黑名单的客户为：' + accname+ '<br/>';
                body += '黑名单的经销商1为：' + angency1+ '<br/>';
            }else if(AccDealerBlacklist=='23'){
                body += '黑名单的经销商1为：' + angency1+ '<br/>';
                body += '黑名单的经销商2为：' + angency2+ '<br/>';
            }else if(AccDealerBlacklist=='13'){
                body += '黑名单的客户为：' + accname+ '<br/>';
                body += '黑名单的经销商2为：' + angency2+ '<br/>';
            }else if(AccDealerBlacklist=='1'){
                body += '黑名单的客户为：' + accname+ '<br/>';
            }else if(AccDealerBlacklist=='2'){
                body += '黑名单的经销商1为：' + angency1+ '<br/>';
            }else if(AccDealerBlacklist=='3'){
                body += '黑名单的经销商2为：' + angency2+ '<br/>';
            }
           
            body += '<a href="' + System.Label.Environment_Url + oppid + '">'
                    + System.Label.Environment_Url+ oppid +'</a><br/>'; 
            body += '谢谢！';
  
            Messaging.SingleEmailMessage messageNEW = new Messaging.SingleEmailMessage();
            messageNEW.setSubject(title);
            messageNEW.setHtmlBody(body);
            messageNEW.setCharset('UTF-8');
            messageNEW.setToAddresses(MailsList); 

            //List<String> toCcMailsList = new List<String>();
            //toCcMailsList.add('youchang@prec-tech.com');
            //messageNEW.setCcAddresses(toCcMailsList); 
            
            sendMails.add(messageNEW);

        }                      
            
        boolean rs = true;
        if (sendMails.size() > 0) {
            Messaging.Email[] allMails = new Messaging.Email[]{};
            for(Integer j = 0; j < sendMails.size(); j++) {
                allMails.add(sendMails.get(j));
            }
            system.debug('222===:'+allMails);
        
            Messaging.SendEmailResult[] results = Messaging.sendEmail(allMails);
            System.debug('results 结果 :'+results);
            for (Integer i = 0; i < results.size(); i++) {
                if (results[i].success == false) {
                    system.debug('=====send mail error:' + results[i].errors[0].message);
                    rs = false;
                }   
            }
        }
        return rs;
    }
    @AuraEnabled
    public static UpdateResult updateOppotunity(        
        String recordId
    ) {
        UpdateResult result = new UpdateResult();
        result.recordId = recordId;
        try{
            Opportunity opp=new Opportunity(id=recordId);
            opp.Contract_Authorize__c = true;

			opp.If_Interface_Lock__c=true;
			
			opp.IF_Submit__c = true;
            update opp;
            result.success = true;
            result.errors = new List<String>();
            return result;
        }catch(Exception e){
            result.success = false;
            result.errors = new List<String>();
            if(e.getMessage().contains(':')){
                String eMessage =e.getMessage();
                Integer left = eMessage.indexOf(',')+1;
                Integer right= eMessage.lastIndexOf('。 ')+1;
                if(right>eMessage.length()||right<=left){
                    right=eMessage.length();
                }
                String mes=eMessage.substring(left,right);
                result.errors.add(mes);
            }else{
                result.errors.add(e.getMessage());
            }
            System.debug(LoggingLevel.INFO,'updateOppotunity  Error : ' + e);
        }
        return result;
    }
    @AuraEnabled
	public static String submitApprovalRequest(String recordId) {
		try{
		   Approval.ProcessSubmitRequest req = new Approval.ProcessSubmitRequest();
		   req.setObjectId(recordId);
		   Approval.ProcessResult result = Approval.process(req);
		   if(result!=null&&result.getErrors()!=null&&result.getErrors().size()>0) return result.getErrors().get(0).getMessage();
		}catch(Exception e){
			System.debug('LexStockCancelController submitApprovalRequest  error: '+e.getMessage());
			return e.getMessage();
		}
	   	return null;
	}

	@AuraEnabled
	public static String getProfileId(){
		return UserInfo.getProfileId();
	}
    @AuraEnabled
    public static boolean queryProfileId(){
        List<Profile> res=[select id,name from profile where name in 
        ('2J3_特约店窗口','2M4_市场产品本部担当(询价)','系统管理员','2S6-2_营业助理','2S7_销售本部合同管理窗口','2S6-1_销售本部窗口')
        ];
        for(Profile p:res){
            if (UserInfo.getProfileId()==p.id) {
                return true;
            }
        }
        return false;
    }
	@AuraEnabled
	public static Boolean judgeIsAssistantAppliedOutTime(String  Quoteid) {
        List<PromotionSales__c> PromotionSalesList = [select id,IsAssistantAppliedOutTime__c from PromotionSales__c where Quote__r.Quote_No__c =:Quoteid];
        for(PromotionSales__c pro : PromotionSalesList){
            if(pro.IsAssistantAppliedOutTime__c){
                return false;
            }
        }
        return true;
    }
     @AuraEnabled
	public static Opportunity searchOpportunity(String oppid) {
		try{
		   Opportunity res=[select Id,Contract_Authorize_Lock__c from Opportunity where Id =:oppid];
		   return res;
		}catch(Exception e){
			System.debug('LexStockCancelController submitApprovalRequest  error: '+e.getMessage());
		}
	   	return null;
	}
	@AuraEnabled
    // LHJ 阿西赛多检查 Start
    public  static String checkDangerItem(String agency1) {
        //没有危化品证照的提示信息
        String licenseStr = '第一经销商没有有效的危险化学品经营许可证。';
        //没有阿西赛多经销商协议的提示信息
        String accStr = '第一经销商没有阿西赛多经销商协议。';

        //检查是否有证照
        List<License_Information__c> licenseList = [SELECT Id
                                                      FROM License_Information__c
                                                     WHERE LicenseAndAccount__c = :agency1
                                                       AND LicenseType__c = '危险化学品经营许可证'
                                                       AND Is_Active_Formula__c = true
                                                       
                                                    ];
        //检查是否有阿西赛多协议
        List<Account> accountList = [SELECT Id
                                                      FROM Account
                                                     WHERE Parent.id = :agency1
                                                       //阿西赛多 增加检索阿西赛多协议 以及 可以做报价(复选框) 精琢技术 wql 2021/01/04 start
                                                       AND Contract_Quote_Decide_Flag_checkbox__c =true
                                                       AND Assiesedo_Dealer__c  = true
                                                       //阿西赛多 增加检索阿西赛多协议 以及 可以做报价(复选框) 精琢技术 wql 2021/01/04 end
                                                    ];

        system.debug('licenseList:'+licenseList.size());
        system.debug('agency1:'+agency1);
        //①既没有危化品证也没有阿西赛多协议
        if(licenseList.size() == 0 && accountList.size() ==0){
            return licenseStr+accStr;
        }
        //②没有危化品证
        else if(licenseList.size() ==0){
            return licenseStr;
        }
        //②没有阿西赛多经销商协议
        else if(accountList.size() ==0){
            return accStr;
        }
        //③全都有
        else{
            return 'OK';
        }
    }
    @AuraEnabled
    public static String oppCheck(String oppid, String saveFlg) {

        Map<Id, String> proMap= new Map<Id, String>();
        List<OpportunityLineItem> OppItemList = [select PricebookEntry.Product2Id, PricebookEntry.Product2.Name
                                                   From OpportunityLineItem 
                                                  Where OpportunityId = :oppid];

        if (OppItemList.size() > 0) {
            for (OpportunityLineItem opl : OppItemList) {
                proMap.put(opl.PricebookEntry.Product2Id, opl.PricebookEntry.Product2.Name);
            }
        }

        List<Opportunity> oppList = [select Agency1__c from Opportunity where id = :oppid];
        String angencyId = oppList[0].Agency1__c;
        String strRet = '';

        if (saveFlg == '1') {
            strRet = checkProRegisterDecide(proMap, angencyId, oppid);
        } else {
            strRet = checkProRegisterDecide(proMap, angencyId, '');
        }
        return strRet;
    }
    public static String checkProRegisterDecide(Map<Id, String> proMap, String agency1, String OppId) {
    
        String errormessage = '';
        Boolean error = false;

        Map<String, String> CheckMap = new Map<String, String>();
        CheckMap = MapCheckProRegisterDecide(proMap, agency1, OppId);
        if (CheckMap.isEmpty()) {
            return 'OK';
        } else {
            return '有不可销售产品或超出经销商经营范围，请更新报价单' + CheckMap;
        }

    }
    @AuraEnabled
    public static String updReg(String  oppid) {

        List<OpportunityLineItem> updList = new List<OpportunityLineItem>();
        List<OpportunityLineItem> OppItemList = [select id, Id__c, Register_alleffective__c,
                                                        PricebookEntry.Product2.RegisterNo_ALL__c 
                                                           From OpportunityLineItem 
                                                          Where OpportunityId = :oppid];
        for (OpportunityLineItem ol : OppItemList) {
            ol.Register_alleffective__c = ol.PricebookEntry.Product2.RegisterNo_ALL__c;
            updList.add(ol);
        }
        if (updList.size() > 0)  update updList;
        return 'OK';
    }
    public static Map<String, String> MapCheckProRegisterDecide(Map<Id, String> proMap, String agency1, String OppId) {

        Map<String, String> retMap = new Map<String, String>();
        String errormessage = '';
        Boolean error = false;
        Map<String,List<String>> proAllBSstrMap;
        List<String> proNotNeedList = new List<String>();

        Map<String,List<String>> old_newMap = new Map<String,List<String>>();
        Map<String,List<String>> new_oldMap = new Map<String,List<String>>();

        // 取得 经营范围对应产品关系
        List<String> midStr = new List<String>();
        List<String> midStrO = new List<String>();

        // List<Product_Register_contrast__c> rrList = Product_Register_contrast__c.getall().values();

        // for (Product_Register_contrast__c rr : rrList) {

        //     midStr = new List<String>();
        //     midStrO = new List<String>();

        //     // 经营范围对应产品关系 Map作成 旧-新对照
        //     if (old_newMap.containsKey(rr.Register_old__c)) {
        //         old_newMap.get(rr.Register_old__c).add(rr.Register_new__c);
        //     } else {
        //         midStrO.add(rr.Register_new__c);
        //         old_newMap.put(rr.Register_old__c, midStrO.clone());
        //     }

        //     // 经营范围对应产品关系 Map作成 新-旧对照
        //     if (new_oldMap.containsKey(rr.Register_new__c)) {
        //         new_oldMap.get(rr.Register_new__c).add(rr.Register_old__c);
        //     } else {
        //         midStr.add(rr.Register_old__c);
        //         new_oldMap.put(rr.Register_new__c, midStr.clone());
        //     }
            
        // }
        // 取得经销商 医疗器械经营许可证
        List<License_Information__c> licenseList = [SELECT Id,
                                                           ScopeKey__c, 
                                                           LicenseType__c
                                                      FROM License_Information__c
                                                     WHERE LicenseAndAccount__c = :agency1
                                                    AND (LicenseType__c = '医疗器械经营许可证'
                                                        OR LicenseType__c = '第二类医疗器械经营备案凭证')
                                                      AND Is_Active_Formula__c = true
                                                    ];
        // 判断 医疗器械经营许可证 是否存在
        if (licenseList.size() == 0) {
            error = true;
            errormessage = '第一经销商没有有效的医疗器械经营许可证。';
            retMap.put('agency', '0');

        } else {
            //经销商经营范围
            List<String> agListA = new List<String>();
            List<String> agListTemp = new List<String>();
            List<String> agList = new List<String>();

            //取经销商下 所有医疗器械经营许可证、第二类医疗器械经营备案凭证
            for (License_Information__c li : licenseList) {
                if (li.ScopeKey__c != null) {
                    agListA.addAll(li.ScopeKey__c.split(';'));
                    agListTemp.addAll(li.ScopeKey__c.split(';'));
                }
            }
            for (String a : agListTemp) {
                if (a.length() >= 6) {
                    agList.add(a.substring(0, a.length() - 1));
                } else {
                    agList.add(a.trim());
                }                
            }

            //产品注册证
            Map<String,Map<String,String>> proBSMap = new Map<String,Map<String,String>>();
            
            Map<String,String> proMidMap = null;
            //产品所有有效注册证（可以和经销商匹配）
            proAllBSstrMap = new Map<String,List<String>>();
            set<Id> proIdList = new set<Id>();

            for (String qli : proMap.keySet()) {     
                    proIdList.add(qli);
                    proBSMap.put(qli, proMidMap);
                    List<String> empList = new List<String>();
                    proAllBSstrMap.put(qli, empList);
                
            }

            List<Product_Register_Link__c> prls = [
                                                 Select Product2__c,
                                                        Product2__r.Asset_Model_No__c,
                                                        Product2__r.SFDA_Approbated_Status__c,
                                                        Product2__r.SFDA_Status_New__c, // 产品的CFDA最终状态 20181225
                                                        Product_Register__r.Name,
                                                        Product_Register__r.BusinessScopeKey__c, 
                                                        Product_Register__r.RegisterNoStatus__c,
                                                        Product_Register__r.MedPrdClass__c 
                                                   From Product_Register_Link__c
                                                  where Product2__c in :proIdList
                                                  ];

            // LHJ 20190102 增加跳过逻辑 Start
            List<Product2> productList = [select ID,SFDA_Status__c from Product2 where id in :proIdList];
            for (Product2 pro : productList) {
                if (pro.SFDA_Status__c == '不要') {
                    proNotNeedList.add(pro.ID);
                }
            }
            // LHJ 20190102 增加跳过逻辑 End

            for (Product_Register_Link__c prl : prls) {
                
                // 设置产品类别MAP
                if (String.isNotBlank(prl.Product_Register__r.BusinessScopeKey__c)) {
                    system.debug('Product2 +++++++' + prl.Product2__c);
                    if (proBSMap.get(prl.Product2__c) != null) {
                        proBSMap.get(prl.Product2__c).put(prl.Product_Register__r.Name, prl.Product_Register__r.BusinessScopeKey__c);
                    
                    } else {
                        Map<String,String> toooMap = new Map<String,String>();
                        toooMap.put(prl.Product_Register__r.Name, prl.Product_Register__r.BusinessScopeKey__c);
                        proBSMap.put(prl.Product2__c, toooMap.clone());
                    }
                }

                // 产品的产品注册证是"不要"状态 不需要匹配注册证 20181225
                if (prl.Product2__r.SFDA_Approbated_Status__c == '不要' 
                        
                        || prl.Product_Register__r.MedPrdClass__c == '1') {
                     proNotNeedList.add(prl.Product2__c);
                }
            }
            system.debug('proBSMap +++++++' + proBSMap);
            for (String qli : proMap.keySet()) {

                String proId = qli;
                String proName = proMap.get(proId);

                if (proId != null) {
                    Boolean haveBS = false;

                    // 产品属于非医疗，不用判断经营范围
                    if (proNotNeedList.contains(proId)) {
                        haveBS = true;
                        continue;
                    }

                    if (proBSMap.get(proId) == null) {
                        error = true;
                        errormessage += '产品"' + proName + '"没有有效的产品注册证。\n';
                        retMap.put(proId, '1');
                        continue;
                    }


                    if (proBSMap.get(proId) != null) {
                        system.debug('111 +++++++' + proBSMap);
                        Map<String,String> midMap = new Map<String,String>();
                        midMap = proBSMap.get(proId);

                        for (String str : midMap.keySet()) {
                            // LHJ 20200711 Start
                            String strMidMap = midMap.get(str);
                            List<String> proRegList = new List<String>();
                            proRegList.addAll(strMidMap.split(';'));
                            // LHJ 20200711 End
                            for(String strReg:proRegList){
                                // 被定义为"6815A"的产品类别,经营范围中必须有6815或者6815A外才可以匹配。
                                if (strReg.length() == 6) {
                                
                                    for(String strAg:agListA){
                                        if(strAg.length() >= 5 && midMap.get(str.substring(0, str.length() - 1)) == strAg.substring(0,5)){
                                            proAllBSstrMap.get(proId).add(str.substring(0, str.length() - 1));
                                            haveBS = true;
                                            break;
                                        }
                                    }

                                    /*if (agListA.contains(midMap.get(str.substring(0, str.length() - 1)))) {
                                        proAllBSstrMap.get(proId).add(str.substring(0, str.length() - 1));
                                        haveBS = true;
                                    }*/
                                } else {
                                    system.debug('agList +++++++' + agList);
                                    system.debug('midMap +++++++' + strReg);

                                    if (agList.contains(strReg)) {

                                        //产品类别,匹配到经销商类别
                                        proAllBSstrMap.get(proId).add(str);
                                        haveBS = true;
                                        break;
                                    }
                                }  
                            }
                            
                                                      
                        }
                    }

                    if (!haveBS) {
                        error = true;
                        errormessage += '第一经销商的经营范围中不包含产品" ' + proName + '"。\n';
                        retMap.put(proId, '2');
                    }
                }
            }
        }

        if (retMap.isEmpty() == false) {
            //return errormessage;
            
        } else {
            if (OppId != '') {
                // 更新所有注册证信息
                String strRegister_alleffective;
                List<Product2> pro2List = new List<Product2>();
                Map<String, Product2> pro2Map = new Map<String, Product2>();
                List<OpportunityLineItem> updList = new List<OpportunityLineItem>();
                List<OpportunityLineItem> OppItemList = [select id, Id__c, Register_alleffective__c,PricebookEntry.Product2Id
                                                           From OpportunityLineItem 
                                                          Where OpportunityId = :OppId];
                // 非医疗或1类产品，取得
                if (proNotNeedList != null && proNotNeedList.size() > 0) {
                    pro2List = [select id, SFDA_Approbated_Status__c, RegisterNo_ALL__c from Product2 where Id in :proNotNeedList];
                }
                for (Product2 pro2 : pro2List) {
                    pro2Map.put(pro2.Id, pro2);
                }

                for (OpportunityLineItem ol : OppItemList) {
                    if (proAllBSstrMap.containsKey(ol.PricebookEntry.Product2Id)) {
                        ol.Register_alleffective__c = '';
                        for(String str: proAllBSstrMap.get(ol.PricebookEntry.Product2Id)) {

                            if (String.isNotBlank(ol.Register_alleffective__c)) {
                                ol.Register_alleffective__c += ';' + str;
                            } else {
                                ol.Register_alleffective__c = str;
                            }
                        }
                        // 非医疗或1类产品
                        if (pro2Map.containskey(ol.PricebookEntry.Product2Id)) {
                            if (pro2Map.get(ol.PricebookEntry.Product2Id).SFDA_Approbated_Status__c == '不要') {
                                ol.Register_alleffective__c = 'FYL';
                            } else {
                                ol.Register_alleffective__c = pro2Map.get(ol.PricebookEntry.Product2Id).RegisterNo_ALL__c;
                            }
                        }
                    }
                    updList.add(ol);
                }
                if (updList.size() > 0)  update updList;
            }
        }
        //如果不满足阿西赛多的条件，进入这个变量 20200821 ljh 
        return retMap;
    }
    public class UpdateResult {
        @AuraEnabled public String recordId {get;set;}
        @AuraEnabled public Boolean success {get;set;}
        @AuraEnabled public List<String> errors {get;set;}
    }
	public class InitData{

      
    }
    // @AuraEnabled
    // public static void test(){
    //     Integer i=0;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
    //     i++;
        
    // }
}