public without sharing class LoanerAppDetailTriggerHandler {
	public static Boolean runTrigger = true;
	//废弃
	public static string upsertDiscarded(List<loaner_application_detail__c> newList, Map<Id, loaner_application_detail__c> newMap, List<loaner_application_detail__c> oldList, Map<Id, loaner_application_detail__c> oldMap){
		List<String> assetIdList = new List<String>();
		List<string> ladcIdList = new List<string>();
		loaner_application_detail__c old = null;
		for(loaner_application_detail__c ladc : newList){
			old = oldMap.get(ladc.Id);
			if(old.RAESD_Status__c != ladc.RAESD_Status__c && ladc.RAESD_Status__c == '废弃'){
				assetIdList.add(ladc.LOANER__c);
				ladcIdList.add(ladc.id);			
			}
		}

		if(ladcIdList.size() == 0){
			return '';
		}

		List<loaner_application_detail__c> ladcList = [select id,Abandoned_Date__c from loaner_application_detail__c where id=:ladcIdList];
		List<Asset> assetList = [select id,RecordType.Id from Asset where id=:assetIdList];

		for(Asset asset : assetList){
			if(asset.RecordType.Id == System.label.Asset_Record_Type1){
            	asset.Status = '废弃';
            	asset.Abandoned_date__c = Date.today();
            }
		}

		for(loaner_application_detail__c la : ladcList){
			la.Abandoned_Date__c = Date.today();
		}
		update(ladcList); 
		update(assetList);
		return '';
	}
	//欠品确认
	public static string upsertCheckLost(List<loaner_application_detail__c> newList, Map<Id, loaner_application_detail__c> newMap, List<loaner_application_detail__c> oldList, Map<Id, loaner_application_detail__c> oldMap){
		
		List<Asset> assetList = new List<Asset>();
		List<String> assetIdList = new List<string>();
		List<string> ladcIdList = new List<string>();
		Set<string> lacIdSet = new Set<string>();
		loaner_application_detail__c old = null;
		//获取明细状态由'欠品中'修改为新状态的明细id
		for(loaner_application_detail__c ladc : newList){
			old = oldMap.get(ladc.Id);
			if(old.RAESD_Status__c != ladc.RAESD_Status__c && old.RAESD_Status__c == '欠品中'){
				ladcIdList.add(ladc.id);
			}
		}
		//如果没有符合条件的明细,跳出
		if(ladcIdList.size() == 0){
			return '';
		}

		List<loaner_application_detail__c> ladcList = [select id,LOANER__c,RAESD_Status__c,loaner_application__c from loaner_application_detail__c where id=:ladcIdList];
		

		for(loaner_application_detail__c la : ladcList){
			if(la.RAESD_Status__c == '丢失'){
				la.Lost_Date__c = Date.today();
				la.inTime__c = Datetime.now();
				assetIdList.add(la.LOANER__c);

			}else if(la.RAESD_Status__c == '已回收'){
				la.Received_loaner_Date__c = Date.today();
				la.inTime__c = Datetime.now();
				la.Check_lost_Item__c = 'ok';
			}
			la.Lost_item_check_Date__c = Date.today();
			lacIdSet.add(la.loaner_application__c);
		}

		List<Asset> allAssetList = [select id,RecordType.Id from Asset where id=:assetIdList];
		for(Asset asset : allAssetList){
			if(asset.RecordType.Id == System.label.Asset_Record_Type1){
				asset.Status = '丢失';
				asset.Lost_date__c = Date.today();
				assetList.add(asset);
			}
		}

		List<loaner_application__c> lacList = [select Id,Status__c,Equipment_Type__c from loaner_application__c where Id = :lacIdSet];
		for(loaner_application__c lac: lacList){
			if(lac.Status__c != '完毕'){
				lac.Status__c =  LoanerOrderState.getOrderStater(lac.Id);
				if(lac.Status__c =='全部回收'){
                   lac.LoanerClosedDateAll__c =Date.today();
                   if(lac.Equipment_Type__c == 'NDT' || lac.Equipment_Type__c == 'ANI'){
                    	PrototypeToThaw.UserUnfreeze(lac.Id);
                   }
                }
			}
		}
		update(assetList);
		update(ladcList);
		update(lacList);
		return '';
	}

	//删除后状态更新
	public static void delStatusUp(List<loaner_application_detail__c> newList, Map<Id, loaner_application_detail__c> newMap, List<loaner_application_detail__c> oldList, Map<Id, loaner_application_detail__c> oldMap){
		Set<String> loanerAppSet = new Set<String>();
		Set<String> loanerSet = new Set<String>();
		for (loaner_application_detail__c local : oldList) {
            loanerSet.add(local.LOANER__c);
            loanerAppSet.add(local.loaner_application__c);
        }
        Map<String,Integer> resultsMap = new Map<String,Integer>();
        //王鹏伟 新加where条件  AND RAESD_Status_F__c != '取消'
        AggregateResult[] results = [select LOANER__c,Count(Id) LOANERNo
                                 from  loaner_application_detail__c
                                 where loaner_application__c not in :loanerAppSet
                                 and LOANER__c in :loanerSet
                                and (loaner_application__r.Approval_Date__c != null AND Received_loaner_Date__c = null AND RAESD_Status_F__c != '取消')
                                AND LOANER__r.RecordTypeId  = :System.label.Asset_Record_Type1
                                 GROUP by LOANER__c];
                                 System.debug('results +++++' + results);
        for(AggregateResult ar: results){
            resultsMap.put(String.valueOf(ar.get('LOANER__c')), Integer.valueOf(ar.get('LOANERNo')));
        }
        List<Asset> pss = [select Id,Status from Asset where RecordTypeId = :System.label.Asset_Record_Type1
                                  AND Id in : loanerSet];
        List<Asset> pssexit = new List<Asset>();
        for(Asset lId : pss){
        	if(!resultsMap.containsKey(lId.Id)){
        		Asset p2s = new Asset();
                p2s.Id =  lId.Id;
                p2s.Status = '在库';
                pssexit.add(p2s);
        	}
        }
        System.debug('pss +++++' + pss);
        if(pssexit.size() > 0){
        	upsert pssexit;
        }
	}

	//插入后状态更新
	public static void insStatusUp(List<loaner_application_detail__c> newList, Map<Id, loaner_application_detail__c> newMap, List<loaner_application_detail__c> oldList, Map<Id, loaner_application_detail__c> oldMap){
		Set<String> loanerSet = new Set<String>();
		for (loaner_application_detail__c local : newList) {
            if(local.RAESD_Status__c == '已出库指示' || local.RAESD_Status__c == '已批准' || local.RAESD_Status__c == '申请中'){
                loanerSet.add(local.LOANER__c);
            }
        }
        List<Asset> tmpList = new List<Asset>();
        for(Asset ass : [select Id,Status from Asset where Id in : loanerSet AND Status = '在库' AND RecordTypeId  = :System.label.Asset_Record_Type1]){
            ass.Status = '冻结';
            tmpList.add(ass);
        }
        List<loaner_application__c> laList = [select id,Status__c,Loaner_LendOrder__c from loaner_application__c where id = :loanerSet];
        List<loaner_application_detail__c> ladList = new List<loaner_application_detail__c>();
        for(loaner_application_detail__c local : newList){
        	for(loaner_application__c temp : laList){
        		if(temp.id == local.LOANER__c){
        			if(temp.Status__c != '草案中' && temp.Status__c != '已提交' && temp.Status__c != '申请中' && temp.Loaner_LendOrder__c == true){
        				loaner_application_detail__c lad = new loaner_application_detail__c();
        				lad.RAESD_Status__c = '已批准';
        				ladList.add(lad);
        			}
        		}
     		}
        }
        if(ladList.size() > 0) update ladList;
        if(tmpList.size() > 0) update tmpList;
	}

	public static void setUser(List<loaner_application_detail__c> newList, Map<Id, loaner_application_detail__c> newMap, List<loaner_application_detail__c> oldList, Map<Id, loaner_application_detail__c> oldMap){
		List<String> ladIdList = new List<String>();
		for(loaner_application_detail__c lad : newList){
			if(lad.loaner_Manager__c == null){
				ladIdList.add(lad.Id);
			}
		}

		if(ladIdList.size()>0){
			List<loaner_application_detail__c> ladList = [select id,loaner_application__r.loaner_Manager__c from loaner_application_detail__c where Id= : ladIdList];
			List<loaner_application_detail__c> updateList = new List<loaner_application_detail__c>();
			for(loaner_application_detail__c lad : ladList){
				lad.loaner_Manager__c = lad.loaner_application__r.loaner_Manager__c;
				updateList.add(lad);
			}

			update updateList;
		} 
	}

	public static void notReceivingNum(List<loaner_application_detail__c> newList, Map<Id, loaner_application_detail__c> newMap, List<loaner_application_detail__c> oldList, Map<Id, loaner_application_detail__c> oldMap){
		Map<String,Integer> leIdMap = new Map<String,Integer>();
		for(loaner_application_detail__c lad : newList){
			loaner_application_detail__c old = oldMap.get(lad.id);
			if(lad.RAESD_Status__c != old.RAESD_Status__c && lad.RAESD_Status__c == '申请者已收货' && lad.Loaner_Express__c != null){
				if(leIdMap.containsKey(lad.Loaner_Express__c)){
					leIdMap.put(lad.Loaner_Express__c, (leIdMap.get(lad.Loaner_Express__c)+1));
				}else{
					leIdMap.put(lad.Loaner_Express__c,1);
				}
			}
			if(lad.RAESD_Status__c != old.RAESD_Status__c && lad.RAESD_Status__c == '已回收' && lad.Return_Express__c != null){
				if(leIdMap.containsKey(lad.Return_Express__c)){
					leIdMap.put(lad.Return_Express__c, (leIdMap.get(lad.Return_Express__c)+1));
				}else{
					leIdMap.put(lad.Return_Express__c,1);
				}
			}
		}
		System.debug(leIdMap);
		if(leIdMap.size() == 0){
			return;
		}
		List<Loaner_Express__c> updateList = new List<Loaner_Express__c>();
		List<Loaner_Express__c> leList = [select id,NotReceivingNum__c from Loaner_Express__c where id= :leIdMap.keySet()];
		for(Loaner_Express__c le : leList){
			if(le.NotReceivingNum__c != null){
				le.NotReceivingNum__c = le.NotReceivingNum__c - leIdMap.get(le.id);
			}
			System.debug(le.NotReceivingNum__c);
			updateList.add(le);
		}

		update updateList;
	}

	//明细中计算自动收货日期和收货提醒日期
	public static void emailDate(List<loaner_application_detail__c> newList, Map<Id, loaner_application_detail__c> newMap, List<loaner_application_detail__c> oldList, Map<Id, loaner_application_detail__c> oldMap){
		List<String> autoId = new List<String>();
		List<String> remindId = new List<String>();

		for(loaner_application_detail__c lad : newList){
			loaner_application_detail__c old = oldMap.get(lad.id);
			if(lad.Automatic_Received_Date__c == null && lad.Shipment_Request_Date__c != null){
				autoId.add(lad.id);
			}
			if(lad.Automatic_Received_Date__c != old.Automatic_Received_Date__c){
				remindId.add(lad.id);
			}
		}
		Map<String,OlympusCalendar__c> oCalendar = calendarUtil.getCalendarMap(Date.today().addDays(-30),Date.today().addDays(240));
		System.debug(oCalendar);
		if(oCalendar == null){
			return;
		}
		List<loaner_application_detail__c> autoList = new List<loaner_application_detail__c>();
		
		List<loaner_application_detail__c> remindList = new List<loaner_application_detail__c>();
		
		if(autoId.size()>0){
			autoList = [select id,Shipment_Request_Date__c,Equipment_Type__c from loaner_application_detail__c where id= :autoId];
			for(loaner_application_detail__c auto : autoList){
				if(auto.Equipment_Type__c == 'NDT' || auto.Equipment_Type__c == 'ANI'){
					auto.Automatic_Received_Date__c = calendarUtil.getCorrespondingDate(oCalendar,auto.Shipment_Request_Date__c,3);
					auto.Remind_Received_Date__c = calendarUtil.getCorrespondingDate(oCalendar,auto.Automatic_Received_Date__c,-2);
				}else{
					auto.Automatic_Received_Date__c = calendarUtil.getCorrespondingDate(oCalendar,auto.Shipment_Request_Date__c,5);
					auto.Remind_Received_Date__c = calendarUtil.getCorrespondingDate(oCalendar,auto.Automatic_Received_Date__c,-3);
				}
			}
		}
		if(remindId.size()>0){
			remindList = [select id,Automatic_Received_Date__c from loaner_application_detail__c where id= :remindId];
			for(loaner_application_detail__c remind : remindList){
				remind.Remind_Received_Date__c = calendarUtil.getCorrespondingDate(oCalendar,remind.Automatic_Received_Date__c,-3);
			}
		}
		if(autoList.size()>0) update autoList;
		if(remindList.size()>0) update remindList;

	}
}