package com.xintong.visualinspection.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import com.alibaba.fastjson.JSON;
import com.xintong.visualinspection.bean.*;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.mysql.jdbc.StringUtils;
import com.xintong.visualinspection.dao.master.TeamClassDao;
import com.xintong.visualinspection.dao.master.UserClassDao;
import com.xintong.visualinspection.service.BaseService;
import com.xintong.visualinspection.service.UserClassService;
import com.xintong.visualinspection.util.CacheUtil;

/**
 * 文件名：UserServiceImpl
 * 版本信息：日期：2017/3/30 Copyright 江苏省交通规划设计院 Corporation 2017 版权所有.
 */
@Service
public class UserClassServiceImpl extends BaseService implements UserClassService {

    private static final org.slf4j.Logger logger = LoggerFactory.getLogger(UserClassServiceImpl.class);

    @Autowired
    UserClassDao userClassDao ;
    
    @Autowired
    TeamClassDao teamClassDao;


    private void updateUserClass(List<UserClass> list){
        if(list==null || list.size()==0){ return;}
        //先找出当天该部门所有排班
        List<UserClass> userClassList =  userClassDao.getUsersClassByDeptAndWorkDay(list.get(0));
        List<UnregularUserClass> unregularUserClassList = userClassDao.getUnregularUsersClassByDeptAndWorkDay(list.get(0));

        //组织hash
        HashMap<String,UserClass> userClassHashMap = new HashMap<>();
        HashMap<String,UnregularUserClass> unregularUserClassHashMap = new HashMap<>();

        //组织hash
        HashMap<String,UserClass> userClassHashMaptemp = new HashMap<>();
        HashMap<String,UnregularUserClass> unregularUserClassHashMaptemp = new HashMap<>();



        for (UserClass c:userClassList
             ) {
            String key = c.getDept_id()+""+c.getClass_type()+""+c.getLane()+"";
            userClassHashMap.put(key,c);
        }
        for (UnregularUserClass c:unregularUserClassList
                ) {
            String key = c.getClass_id()+""+c.getStart_time().getTime()+""+c.getEnd_time().getTime()+"";
            unregularUserClassHashMap.put(key,c);
        }

        userClassHashMaptemp.putAll(userClassHashMap);
        unregularUserClassHashMaptemp.putAll(unregularUserClassHashMap);

        StringBuffer nightClassStuff = new StringBuffer();
        StringBuffer middleClassStuff = new StringBuffer();
        StringBuffer mooringClassStuff = new StringBuffer();
        Long mooringTeamId = 0L , middleTeamId =0L , nightTeamId =0L;


        //循环判定
        for(int i=0;i<list.size();i++) {
            if (list.get(i).getList() != null && list.get(i).getList().size() > 0) {
                list.get(i).setClass_flag(1);
            }else{
                list.get(i).setClass_flag(0);
            }

            UserClass objTemp = list.get(i);
            if(objTemp.getClass_type() ==1){
                mooringTeamId = objTemp.getTeam_id();
                mooringClassStuff.append(objTemp.getUser_id()+",");
            }else if(objTemp.getClass_type() ==2){
                middleTeamId = objTemp.getTeam_id();
                middleClassStuff.append(objTemp.getUser_id()+",");
            }else if(objTemp.getClass_type() ==3){
                nightTeamId = objTemp.getTeam_id();
                nightClassStuff.append(objTemp.getUser_id()+",");
            }


            String key = objTemp.getDept_id()+""+objTemp.getClass_type()+""+objTemp.getLane()+"";
            UserClass objTempDB =  userClassHashMaptemp.get(key);
            if(objTempDB!=null){
                //跟新
                objTemp.setId(objTempDB.getId());

                userClassHashMap.remove(key);

                //没换人员和班长 & 没全部删除临时排班人员 则不跟新
                if(!(objTemp.getUser_id().equals(objTempDB.getUser_id())
                        && objTemp.getMonitor_user_id().equals(objTempDB.getMonitor_user_id())
                        && objTemp.getClass_flag().equals(objTempDB.getClass_flag()))){
                    //有改变
                    userClassDao.update(objTemp);
                }

                List<UnregularUserClass> obj = list.get(i).getList() ;
                if(obj!=null && obj.size()>0) {
                    for (int j = 0; j < obj.size(); j++) {
                        obj.get(j).setClass_type(objTemp.getClass_type());
                        obj.get(j).setDept_id(objTemp.getDept_id());
                        obj.get(j).setWork_date(objTemp.getWork_date());
                        obj.get(j).setLane(objTemp.getLane());
                        obj.get(j).setUser_id(obj.get(j).getId());
                        obj.get(j).setTeam_id(objTemp.getTeam_id());
                        obj.get(j).setClass_id(objTemp.getId());
                        obj.get(j).setMonitor_user_id(objTemp.getMonitor_user_id());

                        //判断
                        String key1 = obj.get(j).getClass_id()+""+obj.get(j).getStart_time().getTime()+""+obj.get(j).getEnd_time().getTime()+"";
                        UnregularUserClass unregularUserClass = unregularUserClassHashMaptemp.get(key1);

                        if(unregularUserClass!=null){
                            obj.get(j).setId(unregularUserClass.getId());

                            unregularUserClassHashMap.remove(key1);
                            if(!(unregularUserClass.getUser_id().equals(obj.get(j).getUser_id())
                                    && unregularUserClass.getMonitor_user_id().equals(obj.get(j).getMonitor_user_id()))) {
                                //有改变
                                userClassDao.update_detail(obj.get(j));
                            }
                        }else{
                            //插入
                            userClassDao.insert_detail2(obj.get(j));
                            unregularUserClassHashMaptemp.put(key1,obj.get(j));
                        }
                    }
                }

            }else{
                //插入
                userClassDao.insert(list.get(i));
                userClassHashMaptemp.put(key,list.get(i));

                List<UnregularUserClass> obj = list.get(i).getList() ;
                if(obj!=null && obj.size()>0) {
                    for (int j = 0; j < obj.size(); j++) {
                        obj.get(j).setClass_type(list.get(i).getClass_type());
                        obj.get(j).setDept_id(list.get(i).getDept_id());
                        obj.get(j).setWork_date(list.get(i).getWork_date());
                        obj.get(j).setLane(list.get(i).getLane());
                        obj.get(j).setUser_id(obj.get(j).getId());
                        obj.get(j).setTeam_id(list.get(i).getTeam_id());
                        obj.get(j).setClass_id(list.get(i).getId());
                        obj.get(j).setMonitor_user_id(list.get(i).getMonitor_user_id());

                        String key1 = obj.get(j).getClass_id()+""+obj.get(j).getStart_time().getTime()+""+obj.get(j).getEnd_time().getTime()+"";
                        unregularUserClassHashMaptemp.put(key1,obj.get(j));
                    }
                    userClassDao.insert_detail(obj);

                }
            }
        }


        List<String> cids = new ArrayList<>();
        List<String> ucids = new ArrayList<>();
        //删除无效的排班
        for (UserClass c:userClassHashMap.values()
             ) {
            cids.add(c.getId()+"");
        }
        for (UnregularUserClass c:unregularUserClassHashMap.values()
                ) {
            ucids.add(c.getId()+"");
        }
        if(cids.size()>0){ userClassDao.deleteById(cids);
            UserClassRemove r = new UserClassRemove();
            r.setData(JSON.toJSONString(userClassHashMap));
            r.setType(1);
            userClassDao.insertremove(r);

        }
        if(ucids.size()>0){userClassDao.deleteDetailById(ucids);
            UserClassRemove r = new UserClassRemove();
            r.setData(JSON.toJSONString(unregularUserClassHashMap));
            r.setType(2);
            userClassDao.insertremove(r);
        }


        if(nightClassStuff.toString()!=""){
            // 更新晚班人员
            TeamClass teamClass = new TeamClass();
            teamClass.setTeam_id(nightTeamId);
            teamClass.setWork_date(list.get(0).getWork_date());
            teamClass.setUser_ids(nightClassStuff.toString());
            teamClassDao.updateUserIds(teamClass);
        }
        if(middleClassStuff.toString()!=""){
            TeamClass teamClass = new TeamClass();
            teamClass.setTeam_id(middleTeamId);
            teamClass.setWork_date(list.get(0).getWork_date());
            teamClass.setUser_ids(middleClassStuff.toString());
            teamClassDao.updateUserIds(teamClass);
        }
        if(mooringClassStuff.toString()!=""){
            TeamClass teamClass = new TeamClass();
            teamClass.setTeam_id(mooringTeamId);
            teamClass.setWork_date(list.get(0).getWork_date());
            teamClass.setUser_ids(mooringClassStuff.toString());
            teamClassDao.updateUserIds(teamClass);
        }







    }
    
	@Override
	public void insertList(List<UserClass> list) {
		// TODO Auto-generated method stub
        updateUserClass(list);
//		if(list.size() >0 ){
//			userClassDao.delete(list.get(0));
//			userClassDao.deleteDetail(list.get(0));
//		}else{
//			return ;
//		}
//		StringBuffer nightClassStuff = new StringBuffer();
//		StringBuffer middleClassStuff = new StringBuffer();
//		StringBuffer mooringClassStuff = new StringBuffer();
//		Long mooringTeamId = 0L , middleTeamId =0L , nightTeamId =0L;
//		for(int i=0;i<list.size();i++){
//			if(list.get(i).getList()!=null && list.get(i).getList().size()>0 ){
//				list.get(i).setClass_flag(1);
//			}
//			UserClass objTemp = list.get(i);
//			if(objTemp.getClass_type() ==1){
//				mooringTeamId = objTemp.getTeam_id();
//				mooringClassStuff.append(objTemp.getUser_id()+",");
//			}else if(objTemp.getClass_type() ==2){
//				middleTeamId = objTemp.getTeam_id();
//				middleClassStuff.append(objTemp.getUser_id()+",");
//			}else if(objTemp.getClass_type() ==3){
//				nightTeamId = objTemp.getTeam_id();
//				nightClassStuff.append(objTemp.getUser_id()+",");
//			}
//			userClassDao.insert(list.get(i));
//			List<UnregularUserClass> obj = list.get(i).getList() ;
//			if(obj!=null && obj.size()>0){
//				for(int j=0;j<obj.size();j++){
//					obj.get(j).setClass_type(list.get(i).getClass_type());
//					obj.get(j).setDept_id(list.get(i).getDept_id());
//					obj.get(j).setWork_date(list.get(i).getWork_date());
//					obj.get(j).setLane(list.get(i).getLane());
//					obj.get(j).setUser_id(obj.get(j).getId());
//					obj.get(j).setTeam_id(list.get(i).getTeam_id());
//					obj.get(j).setClass_id(list.get(i).getId());
//				}
//				userClassDao.insert_detail(obj);
//			}
//		}
//		if(nightClassStuff.toString()!=""){
//			// 更新晚班人员
//			TeamClass teamClass = new TeamClass();
//			teamClass.setTeam_id(nightTeamId);
//			teamClass.setWork_date(list.get(0).getWork_date());
//			teamClass.setUser_ids(nightClassStuff.toString());
//			teamClassDao.updateUserIds(teamClass);
//		}
//		if(middleClassStuff.toString()!=""){
//			TeamClass teamClass = new TeamClass();
//			teamClass.setTeam_id(middleTeamId);
//			teamClass.setWork_date(list.get(0).getWork_date());
//			teamClass.setUser_ids(middleClassStuff.toString());
//			teamClassDao.updateUserIds(teamClass);
//		}
//		if(mooringClassStuff.toString()!=""){
//			TeamClass teamClass = new TeamClass();
//			teamClass.setTeam_id(mooringTeamId);
//			teamClass.setWork_date(list.get(0).getWork_date());
//			teamClass.setUser_ids(mooringClassStuff.toString());
//			teamClassDao.updateUserIds(teamClass);
//		}
	}
	
	@Override
	public void updateList(List<UserClass> list) {
        updateUserClass(list);
//		if(list.size() >0 ){
//			userClassDao.delete(list.get(0));
//			userClassDao.deleteDetail(list.get(0));
//		}else{
//			return ;
//		}
//		StringBuffer nightClassStuff = new StringBuffer();
//		StringBuffer middleClassStuff = new StringBuffer();
//		StringBuffer mooringClassStuff = new StringBuffer();
//		Long mooringTeamId = 0L , middleTeamId =0L , nightTeamId =0L;
//
//		for(int i=0;i<list.size();i++){
//			if(list.get(i).getList()!=null && list.get(i).getList().size() >0 ){
//				list.get(i).setClass_flag(1);
//			}
//			else{
//				list.get(i).setClass_flag(0);
//			}
//			UserClass objTemp = list.get(i);
//			if(objTemp.getClass_type() ==1){
//				mooringTeamId = objTemp.getTeam_id();
//				mooringClassStuff.append(objTemp.getUser_id()+",");
//			}else if(objTemp.getClass_type() ==2){
//				middleTeamId = objTemp.getTeam_id();
//				middleClassStuff.append(objTemp.getUser_id()+",");
//			}else if(objTemp.getClass_type() ==3){
//				nightTeamId = objTemp.getTeam_id();
//				nightClassStuff.append(objTemp.getUser_id()+",");
//			}
//			userClassDao.insert(list.get(i));
//			List<UnregularUserClass> obj = list.get(i).getList() ;
//			if(obj!=null && obj.size() > 0){
//				for(int j=0;j<obj.size();j++){
//					obj.get(j).setClass_type(list.get(i).getClass_type());
//					obj.get(j).setDept_id(list.get(i).getDept_id());
//					obj.get(j).setWork_date(list.get(i).getWork_date());
//					obj.get(j).setLane(list.get(i).getLane());
//					obj.get(j).setUser_id(obj.get(j).getId());
//					obj.get(j).setTeam_id(list.get(i).getTeam_id());
//					obj.get(j).setClass_id(list.get(i).getId());
//					obj.get(j).setMonitor_user_id(list.get(i).getMonitor_user_id());
//				}
//				userClassDao.insert_detail(obj);
//			}
//		}
//		if(nightClassStuff.toString()!=""){
//			// 更新晚班人员
//			TeamClass teamClass = new TeamClass();
//			teamClass.setWork_date(list.get(0).getWork_date());
//			teamClass.setTeam_id(nightTeamId);
//			teamClass.setUser_ids(nightClassStuff.toString());
//			teamClassDao.updateUserIds(teamClass);
//		}
//		if(middleClassStuff.toString()!=""){
//			TeamClass teamClass = new TeamClass();
//			teamClass.setWork_date(list.get(0).getWork_date());
//			teamClass.setTeam_id(middleTeamId);
//			teamClass.setUser_ids(middleClassStuff.toString());
//			teamClassDao.updateUserIds(teamClass);
//		}
//		if(mooringClassStuff.toString()!=""){
//			TeamClass teamClass = new TeamClass();
//			teamClass.setWork_date(list.get(0).getWork_date());
//			teamClass.setTeam_id(mooringTeamId);
//			teamClass.setUser_ids(mooringClassStuff.toString());
//			teamClassDao.updateUserIds(teamClass);
//		}
	}

	@Override
	public List<UserClass> selectList(UserClass obj) {
		// 这边需要处理一下 user_name
		List<UserClass> list = userClassDao.selectList(obj);
		for(UserClass userClass : list){
			userClass.setUser_name(CacheUtil.getUserTurenameFromMap(userClass.getUser_id()));
		}
		return list ;
	}

	@Override
	public List<User> getUsersByTeamId(Integer user_class_id) {
		// TODO Auto-generated method stub
		String users= userClassDao.getUsersByTeamId(user_class_id);
		if(!StringUtils.isNullOrEmpty(users)) {
			String[] userArr = users.split(",");
			List<User> userList = new ArrayList<User>();
			for(String s:userArr) {
				userList.add(CacheUtil.userMap.get(Long.parseLong(s)));
			}
			return userList;
		}
		return null;
	}
   
}
