/**
 * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
 */
package com.jeeplus.modules.workstaff.service;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.lang.reflect.Field;
import java.util.Map;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.jeeplus.common.bos.BOSClientUtil;
import com.jeeplus.common.config.Global;
import com.jeeplus.common.oss.OSSClientUtil;
import com.jeeplus.common.utils.DateUtils;
import com.jeeplus.common.utils.IdGen;
import com.jeeplus.common.utils.StringUtils;
import com.jeeplus.modules.sys.dao.UserDao;
import com.jeeplus.modules.sys.entity.User;
import com.jeeplus.modules.sys.utils.DictUtils;
import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
import com.jeeplus.modules.workstaffachiveslog.entity.WorkStaffAchivesLog;
import com.jeeplus.modules.workstaffachiveslog.service.WorkStaffAchivesLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.jeeplus.common.persistence.Page;
import com.jeeplus.common.service.CrudService;
import com.jeeplus.modules.workstaff.entity.WorkStaffEducation;
import com.jeeplus.modules.workstaff.dao.WorkStaffEducationDao;
import org.springframework.web.multipart.MultipartFile;

/**
 * 教育经历Service
 * @author ssrh
 * @version 2018-07-27
 */
@Service
@Transactional(readOnly = true)
public class WorkStaffEducationService extends CrudService<WorkStaffEducationDao, WorkStaffEducation> {
    @Autowired
    private WorkStaffAchivesLogService workStaffAchivesLogService;
    @Autowired
    private UserDao userDao;

	public WorkStaffEducation get(String id) {
		return super.get(id);
	}
	
	public List<WorkStaffEducation> findList(WorkStaffEducation workStaffEducation) {
		return super.findList(workStaffEducation);
	}
	
	public Page<WorkStaffEducation> findPage(Page<WorkStaffEducation> page, WorkStaffEducation workStaffEducation) {
		return super.findPage(page, workStaffEducation);
	}
	
	@Transactional(readOnly = false)
	public void save(WorkStaffEducation workStaffEducation) {
		super.save(workStaffEducation);
	}
	
	@Transactional(readOnly = false)
	public void delete(WorkStaffEducation workStaffEducation) {
		super.delete(workStaffEducation);
	}


    public boolean save(WorkStaffBasicInfo workStaffBasicInfo,boolean first) {
        if(workStaffBasicInfo==null|| StringUtils.isBlank(workStaffBasicInfo.getId())){
            return false;
        }
        List<WorkStaffEducation> list = workStaffBasicInfo.getEducationList();
        if(list==null||list.size()<=0){
            return false;
        }
        boolean flag = false;
        for (WorkStaffEducation entity : list) {
            if(entity!=null&&"1".equals(entity.getDelFlag())&&StringUtils.isBlank(entity.getId())){
                continue;
            }
            if(entity!=null&&"1".equals(entity.getDelFlag())){
                dao.deleteByLogic(entity);
                continue;
            }
            if (entity!=null){
                if(entity.getDegreePhotoFile()!=null&&!entity.getDegreePhotoFile().isEmpty()&&entity.getDegreePhotoFile().getSize()>0){
                    MultipartFile file = entity.getDegreePhotoFile();
                    entity.setDegreePhoto(this.uploadFile(file,entity.getDegreePhoto()));
                }
                if(entity.getEduPhotoFile()!=null&&!entity.getEduPhotoFile().isEmpty()&&entity.getEduPhotoFile().getSize()>0){
                    MultipartFile file = entity.getEduPhotoFile();
                    entity.setEduPhoto(this.uploadFile(file,entity.getEduPhoto()));
                }
                entity.setStaff(workStaffBasicInfo.getId());
                this.save(entity);
                if(first){
                    entity.setId(null);
                    entity.setDegreePhoto("");
                    entity.setEduPhoto("");
                }
                flag =true;
            }
        }
        return flag;
    }

    public String uploadFile(MultipartFile file, String filePath){
	    String date = DateUtils.formatDate(new Date(),"yyMMddHHmm");
	    try {
            if (file != null && file.getSize() > 0) {
                String path = new StringBuilder("/employeeInfo/").append(date)
                        .append(file.getOriginalFilename()).toString();
                InputStream inputStream = file.getInputStream();
                BOSClientUtil bosClientUtil = new BOSClientUtil();
                String url = bosClientUtil.upload(path, inputStream);
                return url;
            }
        }catch (Exception e){
            logger.error("上传文件失败！");
        }
	    return null;
    }

    public void query(WorkStaffBasicInfo workStaffBasicInfo) {
        if(workStaffBasicInfo==null|| StringUtils.isBlank(workStaffBasicInfo.getId())){
            return;
        }
        WorkStaffEducation entity = new WorkStaffEducation();
        entity.setStaff(workStaffBasicInfo.getId());
        workStaffBasicInfo.setEducationList(this.findList(entity));
    }

    private static Map<String,String> EDU_MAP = Maps.newHashMap();//教育经历

    static{//教育经历
        EDU_MAP.put("school", "毕业院校");
        EDU_MAP.put("major", "所学专业");
        EDU_MAP.put("edu", "学历");
        EDU_MAP.put("degree", "学位");
        EDU_MAP.put("eduType", "学历性质");
        EDU_MAP.put("startDate", "入学日期");
        EDU_MAP.put("endDate", "毕业日期");
        EDU_MAP.put("eduPhoto", "学历证书");
        EDU_MAP.put("degreePhoto", "学位证书");
    }
    public boolean saveApply(WorkStaffBasicInfo workStaffBasicInfo,boolean first) {
        if(workStaffBasicInfo==null|| StringUtils.isBlank(workStaffBasicInfo.getId())){
            return false;
        }
        List<WorkStaffEducation> list = workStaffBasicInfo.getEducationList();
        if(list==null||list.size()<=0){
            return false;
        }
        boolean flag = false;
        User u=userDao.get(workStaffBasicInfo.getUserId());
        for (WorkStaffEducation entity : list) {
            entity.setStaff(workStaffBasicInfo.getId());
            WorkStaffEducation workStaffEducation=dao.get(entity.getId());
            if(workStaffEducation==null){
                entity.setCreateBy(u);
                entity.setCreateDate(new Date());
                entity.setUpdateBy(u);
                entity.setUpdateDate(new Date());
                dao.insert(entity);
            }else{
                this.save(entity);
            }
            if(entity!=null&&"1".equals(entity.getDelFlag())){
                dao.deleteByLogic(entity);
                continue;
            }
            flag =true;
        }
        dao.updateFalt(workStaffBasicInfo.getId());
        return flag;
    }
    public void querys(WorkStaffBasicInfo workStaffBasicInfo) {
        SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyy-MM-dd");
        if(workStaffBasicInfo==null|| StringUtils.isBlank(workStaffBasicInfo.getId())){
            return;
        }
        WorkStaffEducation entity = new WorkStaffEducation();
        entity.setStaff(workStaffBasicInfo.getId());
        List<WorkStaffEducation> list=this.findList(entity);
        List<WorkStaffEducation> newList=Lists.newArrayList();
        if(list!=null&&list.size()>0){//修改
            for(WorkStaffEducation workStaffEducation:list){
                Class<? extends WorkStaffEducation> newClass = workStaffEducation.getClass();
                Field[] declaredFields = newClass.getDeclaredFields();
                for (Field field : declaredFields) {
                    String name = field.getName();
                    if("school".equals(name)||"major".equals(name)||"edu".equals(name)||"degree".equals(name)||"eduType".equals(name)
                            || "startDate".equals(name)||"endDate".equals(name)||"eduPhoto".equals(name)||"degreePhoto".equals(name)){
                        String setMethod = "set"+name.substring(0,1).toUpperCase()+name.substring(1);
                        String getMethod = "get"+name.substring(0,1).toUpperCase()+name.substring(1);
                        WorkStaffAchivesLog workStaffAchivesLog=new WorkStaffAchivesLog();
                        workStaffAchivesLog.setStaffId(workStaffBasicInfo.getId());
                        workStaffAchivesLog.setModule("教育经历");
                        workStaffAchivesLog.setSonId(workStaffEducation.getId());
                        workStaffAchivesLog.setFields(name);
                        workStaffAchivesLog.setType("修改");
                        workStaffAchivesLog.setState("1");
                        List<WorkStaffAchivesLog> logs=workStaffAchivesLogService.findList(workStaffAchivesLog);
                        try {
                            Object newInvoke = newClass.getMethod(getMethod).invoke(workStaffEducation);//修改后
                            if(newInvoke instanceof String){
                                Method setReadOnly = workStaffEducation.getClass().getMethod(setMethod, String.class);
                                if(logs!=null&&logs.size()>0){
                                    setReadOnly.invoke(workStaffEducation,logs.get(0).getNewKey());
                                }
                            }
                            if(newInvoke instanceof Date){//日期
                                Method setReadOnly = workStaffEducation.getClass().getMethod(setMethod, Date.class);
                                if(logs!=null&&logs.size()>0){
                                    Date myDate = dateFormat1.parse(logs.get(0).getNewKey());
                                    setReadOnly.invoke(workStaffEducation,myDate);
                                }
                            }
                        } catch (NoSuchMethodException e) {
                            e.printStackTrace();
                        } catch (IllegalAccessException e) {
                            e.printStackTrace();
                        } catch (InvocationTargetException e) {
                            e.printStackTrace();
                        } catch (ParseException e) {
                            e.printStackTrace();
                        }
                    }
                }
                newList.add(workStaffEducation);
            }
        }
        //新增
        WorkStaffAchivesLog workStaffAchivesLog=new WorkStaffAchivesLog();
        workStaffAchivesLog.setStaffId(workStaffBasicInfo.getId());
        workStaffAchivesLog.setModule("教育经历");
        workStaffAchivesLog.setType("新增");
        workStaffAchivesLog.setState("1");
        List<WorkStaffAchivesLog> sonIds=workStaffAchivesLogService.findSonId(workStaffAchivesLog);
        if(sonIds!=null&&sonIds.size()>0){
            for(WorkStaffAchivesLog w:sonIds){
                workStaffAchivesLog.setSonId(w.getSonId());
                WorkStaffEducation workStaffEducation = new WorkStaffEducation();
                workStaffEducation.setId(w.getSonId());
                workStaffEducation.setDelFlag("0");
                workStaffEducation.setStaff(workStaffBasicInfo.getId());
                Class<? extends WorkStaffEducation> newClass = workStaffEducation.getClass();
                Field[] declaredFields = newClass.getDeclaredFields();
                for (Field field : declaredFields) {
                    String name = field.getName();
                    if("school".equals(name)||"major".equals(name)||"edu".equals(name)||"degree".equals(name)||"eduType".equals(name)
                            || "startDate".equals(name)||"endDate".equals(name)||"eduPhoto".equals(name)||"degreePhoto".equals(name)){
                        String setMethod = "set"+name.substring(0,1).toUpperCase()+name.substring(1);
                        String getMethod = "get"+name.substring(0,1).toUpperCase()+name.substring(1);
                        workStaffAchivesLog.setFields(name);
                        List<WorkStaffAchivesLog> logs=workStaffAchivesLogService.findList(workStaffAchivesLog);
                        try {
                            if("startDate".equals(name)||"endDate".equals(name)){//日期
                                Method setReadOnly = workStaffEducation.getClass().getMethod(setMethod, Date.class);
                                if(logs!=null&&logs.size()>0){
                                    Date myDate = dateFormat1.parse(logs.get(0).getNewKey());
                                    setReadOnly.invoke(workStaffEducation,myDate);
                                }
                            }else{
                                Method setReadOnly = workStaffEducation.getClass().getMethod(setMethod, String.class);
                                if(logs!=null&&logs.size()>0){
                                    setReadOnly.invoke(workStaffEducation,logs.get(0).getNewKey());
                                }
                            }
                        } catch (NoSuchMethodException e) {
                            e.printStackTrace();
                        } catch (IllegalAccessException e) {
                            e.printStackTrace();
                        } catch (InvocationTargetException e) {
                            e.printStackTrace();
                        } catch (ParseException e) {
                            e.printStackTrace();
                        }
                    }
                }
                newList.add(workStaffEducation);
            }
        }
        //删除
        WorkStaffAchivesLog delLog=new WorkStaffAchivesLog();
        delLog.setStaffId(workStaffBasicInfo.getId());
        delLog.setModule("教育经历");
        delLog.setType("删除");
        workStaffAchivesLog.setState("1");
        List<WorkStaffAchivesLog> dellogs=workStaffAchivesLogService.findList(delLog);
        if(dellogs!=null&&dellogs.size()>0){
            for(WorkStaffAchivesLog w:dellogs){
                newList.remove(dao.get(w.getSonId()));
            }
        }
        workStaffBasicInfo.setEducationList(newList);
    }

    @Transactional(readOnly = false)
    public void saveEdu(WorkStaffBasicInfo workStaffBasicInfo) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        List<WorkStaffEducation> educationList =workStaffBasicInfo.getEducationList();
        if(educationList!=null&&educationList.size()>0){
            for(WorkStaffEducation newEducation:educationList){
                Class<? extends WorkStaffEducation> newClass = newEducation.getClass();
                Field[] declaredFields = newClass.getDeclaredFields();
                if(newEducation.getId()!=null&&!"1".equals(newEducation.getDelFlag())&&!"".equals(newEducation.getId())){
                    if(newEducation.getDegreePhotoFile()!=null&&!newEducation.getDegreePhotoFile().isEmpty()&&newEducation.getDegreePhotoFile().getSize()>0){
                        MultipartFile file = newEducation.getDegreePhotoFile();
                        newEducation.setDegreePhoto(this.uploadFile(file,newEducation.getDegreePhoto()));
                    }
                    if(newEducation.getEduPhotoFile()!=null&&!newEducation.getEduPhotoFile().isEmpty()&&newEducation.getEduPhotoFile().getSize()>0){
                        MultipartFile file = newEducation.getEduPhotoFile();
                        newEducation.setEduPhoto(this.uploadFile(file,newEducation.getEduPhoto()));
                    }
                    WorkStaffEducation oldEducation=this.get(newEducation.getId());
                    if(oldEducation!=null){
                        Class<? extends WorkStaffEducation> oldClass = oldEducation.getClass();
                        for (Field field : declaredFields) {
                            String name = field.getName();
                            if("school".equals(name)||"major".equals(name)||"edu".equals(name)||"degree".equals(name)||"eduType".equals(name)
                                    || "startDate".equals(name)||"endDate".equals(name)||"eduPhoto".equals(name)||"degreePhoto".equals(name)
                                    ||"degreePhotoFile".equals(name)||"eduPhotoFile".equals(name)){
                                String methodName = "get"+name.substring(0,1).toUpperCase()+name.substring(1);
                                WorkStaffAchivesLog workStaffAchivesLog=new WorkStaffAchivesLog();
                                workStaffAchivesLog.setStaffId(workStaffBasicInfo.getId());
                                workStaffAchivesLog.setModule("教育经历");
                                workStaffAchivesLog.setSonId(newEducation.getId());
                                workStaffAchivesLog.setFields(name);
                                workStaffAchivesLog.setState("1");
                                try {
                                    Object newInvoke = newClass.getMethod(methodName).invoke(newEducation);//修改后
                                    Object oldInvoke = oldClass.getMethod(methodName).invoke(oldEducation);//修改前
                                    String describes=EDU_MAP.get(name);
                                    if(newInvoke instanceof String){
                                        String newValue=newInvoke.toString();
                                        String oldValue=oldInvoke.toString();
                                        if(!newValue.equals(oldValue)){
                                            if("edu".equals(name)){
                                                workStaffAchivesLogService.saveStaffLog(workStaffAchivesLog,workStaffBasicInfo.getId(),
                                                        "教育经历",describes,name,
                                                        DictUtils.getDictLabel(oldValue,"education_level",""),
                                                        DictUtils.getDictLabel(newValue,"education_level",""),
                                                        oldValue,newValue,newEducation.getId(),"修改");
                                            }else if("degree".equals(name)){
                                                workStaffAchivesLogService.saveStaffLog(workStaffAchivesLog,workStaffBasicInfo.getId(),
                                                        "教育经历",describes,name,
                                                        DictUtils.getDictLabel(oldValue,"degree_level",""),
                                                        DictUtils.getDictLabel(newValue,"degree_level",""),
                                                        oldValue,newValue,newEducation.getId(),"修改");
                                            }else if("eduType".equals(name)){
                                                workStaffAchivesLogService.saveStaffLog(workStaffAchivesLog,workStaffBasicInfo.getId(),
                                                        "教育经历",describes,name,
                                                        DictUtils.getDictLabel(oldValue,"edu_type",""),
                                                        DictUtils.getDictLabel(newValue,"edu_type",""),
                                                        oldValue,newValue,newEducation.getId(),"修改");
                                            }else{
                                                workStaffAchivesLogService.saveStaffLog(workStaffAchivesLog,workStaffBasicInfo.getId(),
                                                        "教育经历",describes,name,
                                                        oldInvoke.toString(),newInvoke.toString(),
                                                        oldInvoke.toString(),newInvoke.toString(),newEducation.getId(),"修改");
                                            }
                                        }
                                    }
                                    if(newInvoke instanceof Date){//日期
                                        String newDate="";
                                        String oldDate="";
                                        if(newInvoke!=null){
                                            newDate=sdf.format(newInvoke);
                                        }
                                        if (oldInvoke!=null){
                                            oldDate=sdf.format(oldInvoke);
                                        }
                                        if(!newDate.equals(oldDate)){
                                            workStaffAchivesLogService.saveStaffLog(workStaffAchivesLog,workStaffBasicInfo.getId(),
                                                    "教育经历",describes,name,
                                                    oldDate,newDate,oldDate,newDate,newEducation.getId(),"修改");
                                        }
                                    }
                                } catch (NoSuchMethodException e) {
                                    e.printStackTrace();
                                } catch (IllegalAccessException e) {
                                    e.printStackTrace();
                                } catch (InvocationTargetException e) {
                                    e.printStackTrace();
                                }
                            }
                        }

                    }
                }else if((newEducation.getId()==null||"".equals(newEducation.getId()))&&"0".equals(newEducation.getDelFlag())){//新增
                    if(newEducation.getDegreePhotoFile()!=null&&!newEducation.getDegreePhotoFile().isEmpty()&&newEducation.getDegreePhotoFile().getSize()>0){
                        MultipartFile file = newEducation.getDegreePhotoFile();
                        newEducation.setDegreePhoto(this.uploadFile(file,newEducation.getDegreePhoto()));
                    }
                    if(newEducation.getEduPhotoFile()!=null&&!newEducation.getEduPhotoFile().isEmpty()&&newEducation.getEduPhotoFile().getSize()>0){
                        MultipartFile file = newEducation.getEduPhotoFile();
                        newEducation.setEduPhoto(this.uploadFile(file,newEducation.getEduPhoto()));
                    }
                    String newId=IdGen.uuid();
                    for (Field field : declaredFields) {
                        String name = field.getName();
                        if("school".equals(name)||"major".equals(name)||"edu".equals(name)||"degree".equals(name)||"eduType".equals(name)
                                || "startDate".equals(name)||"endDate".equals(name)||"eduPhoto".equals(name)||"degreePhoto".equals(name)
                                ||"degreePhotoFile".equals(name)||"eduPhotoFile".equals(name)){
                            String methodName = "get"+name.substring(0,1).toUpperCase()+name.substring(1);
                            WorkStaffAchivesLog workStaffAchivesLog=new WorkStaffAchivesLog();
                            workStaffAchivesLog.setStaffId(workStaffBasicInfo.getId());
                            workStaffAchivesLog.setModule("教育经历");
                            workStaffAchivesLog.setSonId(newId);
                            workStaffAchivesLog.setFields(name);
                            workStaffAchivesLog.setState("1");
                            try {
                                Object newInvoke = newClass.getMethod(methodName).invoke(newEducation);//修改后
                                String describes=EDU_MAP.get(name);
                                if(newInvoke instanceof String){
                                    String newValue=newInvoke.toString();
                                    if("edu".equals(name)){
                                        workStaffAchivesLogService.saveStaffLog(workStaffAchivesLog,workStaffBasicInfo.getId(),
                                                "教育经历",describes,name,
                                                "",
                                                DictUtils.getDictLabel(newValue,"education_level",""),
                                                "",newValue,newId,"新增");
                                    }else if("degree".equals(name)){
                                        workStaffAchivesLogService.saveStaffLog(workStaffAchivesLog,workStaffBasicInfo.getId(),
                                                "教育经历",describes,name,
                                                "",
                                                DictUtils.getDictLabel(newValue,"degree_level",""),
                                                "",newValue,newId,"新增");
                                    }else if("eduType".equals(name)){
                                        workStaffAchivesLogService.saveStaffLog(workStaffAchivesLog,workStaffBasicInfo.getId(),
                                                "教育经历",describes,name,
                                                "",
                                                DictUtils.getDictLabel(newValue,"edu_type",""),
                                                "",newValue,newId,"新增");
                                    }else{
                                        workStaffAchivesLogService.saveStaffLog(workStaffAchivesLog,workStaffBasicInfo.getId(),
                                                "教育经历",describes,name,
                                                "",newInvoke.toString(),
                                                "",newInvoke.toString(),newId,"新增");
                                    }
                                }
                                if(newInvoke instanceof Date){//日期
                                    String newDate=sdf.format(newInvoke);
                                    workStaffAchivesLogService.saveStaffLog(workStaffAchivesLog,workStaffBasicInfo.getId(),
                                            "教育经历",describes,name,
                                            "",newDate,"",newDate,newId,"新增");
                                };
                            } catch (NoSuchMethodException e) {
                                e.printStackTrace();
                            } catch (IllegalAccessException e) {
                                e.printStackTrace();
                            } catch (InvocationTargetException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }else if(newEducation.getId()!=null&&"1".equals(newEducation.getDelFlag())&&!"".equals(newEducation.getId())){//删除
                    WorkStaffAchivesLog workStaffAchivesLog=new WorkStaffAchivesLog();
                    workStaffAchivesLog.setStaffId(workStaffBasicInfo.getId());
                    workStaffAchivesLog.setModule("教育经历");
                    workStaffAchivesLog.setSonId(newEducation.getId());
                    workStaffAchivesLog.setType("删除");
                    workStaffAchivesLog.setState("1");
                    workStaffAchivesLogService.saveStaffLog(workStaffAchivesLog,workStaffBasicInfo.getId(),
                            "教育经历","","",
                            "","",
                            "","",newEducation.getId(),"删除");
                }
            }
        }
    }
}