package com.manage.service.ImportExcel;

import com.manage.dao.*;
import com.manage.entity.Power_Dept;
import com.manage.entity.Power_Role;
import com.manage.entity.Power_User;
import com.manage.vo.Power_Sys_DictVo;
import com.manage.vo.Power_User_Dict;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.*;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @ProjectName:importExcelJudgeMethod
 * @Description:导入excel的需要判断字段的集中类
 * @Param
 * @Return
 * @Author: 曾文和
 * @CreateDate: 2019/10/12 9:16
 * @UpdateUser: 曾文和
 * @UpdateDate: 2019/10/12 9:16
 * @UpdateRemark: 更新说明
 * @Version: 1.0
 */
@Component
@Transactional
public class ImportExcelJudgeMethod {
    @Autowired
    private Power_UserMapper userMapper;
    @Autowired
    private Power_RoleMapper roleMapper;
    @Autowired
    private Power_DeptMapper deptMapper;
    @Autowired
    private Power_User_DictMapper userDictMapper;
    @Autowired
    private Power_Sys_DictMapper sysDictMapper;
    //公共批量插入方法
    private static final String SIMPLEINSERT = "SimpleInsert";

    /****************************************导入公共判断******************************************************/
    /**
     * 批量插入
     * */
    public int SimpleInsert(List<Object> list,String mapperName)throws Exception{
        //注入判断方法集中类
        WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
        //获取类实例
        Object bean = wac.getBean(mapperName);
        Class<?>  cls = bean.getClass();
        //获取执行方法
        Method method = cls.getDeclaredMethod(SIMPLEINSERT,List.class);
        return (int)method.invoke(bean,list);
    }
    /**
     * 转换是否有效字段
     * 参数：object:赋值对象，fieldName:属性名，value:excel表格值,head:表格头名称(中文名)，judgeMethod:判断方法
     * head:属性中文名
     * */
    public  String convertEffective(String fieldName, String value, Field f,Object object,String head)throws Exception{
        if("effective".equals(fieldName)){
            //判断长度
            if(value.length() > 9){
                return  "\""+head+"\"输入内容太长,长度为9";
            }
            if(StringUtils.isNotBlank(value)){
                if("是".equals(value)){
                    f.set(object,1);
                }else if("否".equals(value)){
                    f.set(object,0);
                }else{
                    return "\""+head+"\"格式不正确,";
                }
            }else{
                return "\""+head+"\"不能为空,";
            }
        }
        return "";
    }

    /**
     * 判断备注字段
     * 参数：object:赋值对象，fieldName:属性名，value:excel表格值,head:表格头名称(中文名)，judgeMethod:判断方法
     * head:属性中文名
     * */
    public  String judgeRemark(String fieldName, String value, Field f,Object object,String head)throws Exception{
        if("remark".equals(fieldName)){
            //判断长度
            if(value.length() > 50){
                return  "\""+head+"\"输入内容太长,长度为50";
            }
            f.set(object,value);
        }
        return "";
    }

    /****************************************用户导入判断******************************************************/
    /**
     * 判断用户名字段
     * 参数：object:赋值对象，fieldName:属性名，value:excel表格值,head:表格头名称(中文名)，judgeMethod:判断方法
     * head:属性中文名
     * */
    public  String judgeUserName(String fieldName, String value, Field f,Object object,String head)throws Exception{
        if("userName".equals(fieldName)){
            if(StringUtils.isNotBlank(value)){
                //判断长度
                if(value.length() > 16){
                    return  "\""+head+"\"输入内容太长,长度为16";
                }
                //查询是否重复
                List<Power_User> users = userMapper.checkUserName(value);
                if(null == users || users.isEmpty()){
                    f.set(object,value);
                }else{
                    return  "\""+head+"\"已存在,";
                }
            }else{
                return "\""+head+"\"不能为空,";
            }
        }
        return "";
    }

    /**
     * 判断密码字段
     * 参数：object:赋值对象，fieldName:属性名，value:excel表格值,head:表格头名称(中文名)，judgeMethod:判断方法
     * head:属性中文名
     * */
    public  String judgePassWord(String fieldName, String value, Field f,Object object,String head)throws Exception{
        if("userPwd".equals(fieldName)){
            if(StringUtils.isNotBlank(value)){
                //判断长度
                if(value.length() < 6){
                    return  "\""+head+"\"输入内容不能小于6位";
                }
                if(value.length() > 20){
                    return  "\""+head+"\"输入内容太长,长度为20";
                }
                f.set(object,value);
            }else{
                return "\""+head+"\"不能为空,";
            }
        }
        return "";
    }

    /**
     * 转换性别字段
     * 参数：object:赋值对象，fieldName:属性名，value:excel表格值,head:表格头名称(中文名)，judgeMethod:判断方法
     * head:属性中文名
     * */
    public  String convertSex(String fieldName, String value, Field f,Object object,String head)throws Exception{
        String wrongStr = "";
        if("userSex".equals(fieldName)){
            if(StringUtils.isNotBlank(value)){
                //判断长度
                if(value.length() > 9){
                    return  "\""+head+"\"输入内容太长,长度为9";
                }
                if("女".equals(value)){
                    f.set(object,1);
                }else if("男".equals(value)){
                    f.set(object,0);
                }else{
                    wrongStr = "\""+head+"\"格式不正确,";
                }
            }else{
                wrongStr = "\""+head+"\"不能为空,";
            }
        }
        return wrongStr;
    }

    /**
     * 判断年龄字段
     * 参数：object:赋值对象，fieldName:属性名，value:excel表格值,head:表格头名称(中文名)，judgeMethod:判断方法
     * head:属性中文名
     * */
    public  String judgeUserAge(String fieldName, String value, Field f,Object object,String head)throws Exception{
        if("userAge".equals(fieldName)){
            if(StringUtils.isNotBlank(value)){
                //判断长度
                if(value.length() > 3){
                    return  "\""+head+"\"输入内容太长,长度为3";
                }
                Integer age = Integer.valueOf(value);
                if(age >= 0 && age <= 150){
                    f.set(object,age);
                }else{
                    return "\""+head+"\"格式不正确,";
                }
            }
        }
        return "";
    }

   /* *
     * 判断电话号码字段
     * 参数：object:赋值对象，fieldName:属性名，value:excel表格值,head:表格头名称(中文名)，judgeMethod:判断方法
     * head:属性中文名
     * */
    public  String judgeUserTel(String fieldName, String value, Field f,Object object,String head)throws Exception{
        if("userTel".equals(fieldName)){
            if(StringUtils.isNotBlank(value)){
                //判断长度
                if(value.length() > 11){
                    return  "\""+head+"\"输入内容太长,长度为11";
                }
                if(isMobile(value)){
                    f.set(object,value);
                }else{
                    return  "\""+head+"\"格式不正确,";
                }
            }
        }
        return "";
    }

    /**
     * 判断email字段
     * 参数：object:赋值对象，fieldName:属性名，value:excel表格值,head:表格头名称(中文名)，judgeMethod:判断方法
     * head:属性中文名
     * */
    public  String judgeUserEmail(String fieldName, String value, Field f,Object object,String head)throws Exception{
        if("userEmail".equals(fieldName)){
            if(StringUtils.isNotBlank(value)){
                //判断长度
                if(value.length() > 25){
                    return  "\""+head+"\"输入内容太长,长度为25";
                }
                if(isEmail(value)){
                    f.set(object,value);
                }else{
                    return "\""+head+"\"格式不正确,";
                }
            }
        }
        return "";
    }

    /**
     * 判断职位字段
     * 参数：object:赋值对象，fieldName:属性名，value:excel表格值,head:表格头名称(中文名)，judgeMethod:判断方法
     * head:属性中文名
     * *//*
    public  String judgUserPosition(String fieldName, String value, Field f,Object object,String head)throws Exception{
        if("userPosition".equals(fieldName)){
            if(StringUtils.isNotBlank(value)){
                //判断长度
                if(value.length() > 25){
                    return  "\""+head+"\"输入内容太长,长度为25";
                }
                f.set(object,value);
            }else{
                return  "\""+head+"\"不能为空,";
            }
        }
        return "";
    }*/

    /**
     * 判断并转换角色名字段
     * 参数：object:赋值对象，fieldName:属性名，value:excel表格值,head:表格头名称(中文名)，judgeMethod:判断方法
     * head:属性中文名
     * */
    public  String judgeRoleId(String fieldName, String value, Field f,Object object,String head)throws Exception{
        if("roleId".equals(fieldName)){
            if(StringUtils.isNotBlank(value)){
                Power_Role role = roleMapper.checkRoleName(value);
                if(role != null){
                    f.set(object,role.getRoleId());
                }else{
                    return "\""+head+"\"不存在,";
                }
            }else{
                return "\""+head+"\"不能为空,";
            }
        }
        return "";
    }

    /**
     * 判断并转换科室名字段
     * 参数：object:赋值对象，fieldName:属性名，value:excel表格值,head:表格头名称(中文名)，judgeMethod:判断方法
     * head:属性中文名
     * */
    public  String judgeDeptId(String fieldName, String value, Field f,Object object,String head)throws Exception{
        if("deptId".equals(fieldName)){
            if(StringUtils.isNotBlank(value)){
                //取得当前登录账号
                ServletRequestAttributes attr=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
                HttpServletRequest request =attr.getRequest();
                HttpSession session= request.getSession();
                Power_User powerUser1 =(Power_User) session.getAttribute("CURRENT_USER");
                //获取医院ID
                Power_User_Dict userDict = userDictMapper.selectDictIdByUserId(powerUser1.getUserId());
                StringBuilder deptIds = new StringBuilder();
                if(value.contains("@")){
                    String[] values = value.split("@");
                    for (String value1 : values) {
                        if (StringUtils.isNotBlank(value1)) {
                            List<Power_Dept> powerDept = deptMapper.checkDeptName(value1, userDict.getDictId());
                            if (powerDept != null && !powerDept.isEmpty()) {
                                deptIds.append(powerDept.get(0).getDeptId()).append(",");
                            } else {
                                return "\"" + head + "\"其中有不存在,";
                            }
                        }
                    }
                }else{
                    List<Power_Dept> powerDept = deptMapper.checkDeptName(value, userDict.getDictId());
                    if(powerDept != null && !powerDept.isEmpty()){
                        deptIds.append(powerDept.get(0).getDeptId()).append(",");
                    }else{
                        return "\""+head+"\"不存在,";
                    }
                }
                f.set(object,deptIds.substring(0,deptIds.length()-1));
            }else{
                return "\""+head+"\"不能为空,";
            }
        }
        return "";
    }

    /****************************************角色导入判断******************************************************/
    /**
     * 判断角色名
     * 参数：object:赋值对象，fieldName:属性名，value:excel表格值,head:表格头名称(中文名)，judgeMethod:判断方法
     * head:属性中文名
     * */
    public  String judgeRoleName(String fieldName, String value, Field f,Object object,String head)throws Exception{
        if("roleName".equals(fieldName)){
            if(StringUtils.isNotBlank(value)){
                //判断长度
                if(value.length() > 16){
                    return  "\""+head+"\"输入内容太长,长度为16";
                }
                //判断时候存在
                Power_Role role = roleMapper.checkRoleName(value);
                if(null != role){
                    return "\""+head+"\"已存在,";
                }else{
                    f.set(object,value);
                }
            }else{
                return "\""+head+"\"不能为空,";
            }
        }
        return "";
    }
    /**
     * 判断是否可预览
     * 参数：object:赋值对象，fieldName:属性名，value:excel表格值,head:表格头名称(中文名)，judgeMethod:判断方法
     * head:属性中文名
     * */
    public  String judgeShowRecord(String fieldName, String value, Field f,Object object,String head)throws Exception{
        if("showRecord".equals(fieldName)){
            //判断长度
            if(value.length() > 9){
                return  "\""+head+"\"输入内容太长,长度为9";
            }
            if(StringUtils.isNotBlank(value)){
                if("是".equals(value)){
                    f.set(object,Short.valueOf("1"));
                }else if("否".equals(value)){
                    f.set(object,Short.valueOf("0"));
                }else{
                    return "\""+head+"\"格式不正确,";
                }
            }else{
                return "\""+head+"\"不能为空,";
            }
        }
        return "";
    }
    /**
     * 判断是否可下载
     * 参数：object:赋值对象，fieldName:属性名，value:excel表格值,head:表格头名称(中文名)，judgeMethod:判断方法
     * head:属性中文名
     * */
    public  String judgeDownloadRecord(String fieldName, String value, Field f,Object object,String head)throws Exception{
        if("downloadRecord".equals(fieldName)){
            //判断长度
            if(value.length() > 9){
                return  "\""+head+"\"输入内容太长,长度为9";
            }
            if(StringUtils.isNotBlank(value)){
                if("是".equals(value)){
                    f.set(object,Short.valueOf("1"));
                }else if("否".equals(value)){
                    f.set(object,Short.valueOf("0"));
                }else{
                    return "\""+head+"\"格式不正确,";
                }
            }else{
                return "\""+head+"\"不能为空,";
            }
        }
        return "";
    }

    /****************************************科室导入判断******************************************************/
    /**
     * 判断科室名
     * 参数：object:赋值对象，fieldName:属性名，value:excel表格值,head:表格头名称(中文名)，judgeMethod:判断方法
     * head:属性中文名
     * */
    public  String judgeDeptName(String fieldName, String value, Field f,Object object,String head)throws Exception{
        if("deptName".equals(fieldName)){
            if(StringUtils.isNotBlank(value)){
                //判断长度
                if(value.length() > 16){
                    return  "\""+head+"\"输入内容太长,长度为16";
                }
                //判断时候存在
                //取得当前登录账号
                ServletRequestAttributes attr=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
                HttpServletRequest request =attr.getRequest();
                HttpSession session= request.getSession();
                Power_User powerUser1 =(Power_User) session.getAttribute("CURRENT_USER");
                //获取医院ID
                Power_User_Dict userDict = userDictMapper.selectDictIdByUserId(powerUser1.getUserId());
                List<Power_Dept> powerDept = deptMapper.checkDeptName(value, userDict.getDictId());
                if(powerDept != null && !powerDept.isEmpty()){
                    return "\""+head+"\"已存在,";
                }else{
                   f.set(object,value);
                }
            }else{
                return "\""+head+"\"不能为空,";
            }
        }
        return "";
    }

    /**
     * 判断并转换医院字段
     * 参数：object:赋值对象，fieldName:属性名，value:excel表格值,head:表格头名称(中文名)，judgeMethod:判断方法
     * head:属性中文名
     * */
    public  String judgeDictId(String fieldName, String value, Field f,Object object,String head)throws Exception{
        if("dictId".equals(fieldName)){
            if(StringUtils.isNotBlank(value)){
                //判断时候存在
                Power_Sys_DictVo dictVo = sysDictMapper.checkHospitalName(value);
                if(null == dictVo){
                    return "\""+head+"\"不存在,";
                }else{
                    f.set(object,dictVo.getDictId());
                }
            }else{
                return "\""+head+"\"不能为空,";
            }
        }
        return "";
    }

    /**
     * 邮箱校验
     *
     * @param email
     * @return
     */
    public static boolean isEmail(String email) {
        try {
            // 范围 更广的 邮箱验证 “/^[^@]+@.+\\..+$/”
            final String pattern1 = "[\\w.\\\\+\\-\\*\\/\\=\\`\\~\\!\\#\\$\\%\\^\\&\\*\\{\\}\\|\\'\\_\\?]+@[\\w.\\\\+\\-\\*\\/\\=\\`\\~\\!\\#\\$\\%\\^\\&\\*\\{\\}\\|\\'\\_\\?]+\\.[\\w.\\\\+\\-\\*\\/\\=\\`\\~\\!\\#\\$\\%\\^\\&\\*\\{\\}\\|\\'\\_\\?]+";
            final Pattern pattern = Pattern.compile(pattern1);
            final Matcher mat = pattern.matcher(email);
            return mat.matches();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * CJYFIXME搜集号段时间:2017-11-28(这个之后的请自行添加) 手机号:目前全国有27种手机号段。
     * 移动有19个号段：134（0-8）、135、136、137、138、139、147(147（数据卡）)、148(物联网)、150、151、152、
     * 157、158、159、178、182、183、184、187、188、198。
     * 联通有11种号段：130、131、132、--145(数据卡)--、146(物联网)、155、156、166、171、175、176、185、
     * 186。 电信有7个号段：133、--1349--、149、153、173、177、180、181、189、199。 虚拟运营商:
     * (1).移动:1703、1705、1706 (2).联通:1704、1707、1708、1709、171
     * (3).电信:1700、1701、1702 卫星通信:1349
     * <p>
     * 工业和信息化部公示了2017年第10批“电信网码号资源使用证书”颁发结果，批准同意部分单位提出的电信网码号资源有关申请，
     * 其中三大运营商均获得相关物联网号段。 移动: (1).198(0-9)号段(公众移动通信网号) (2).148(0-9)号段(物联网业务专用号段)
     * (3).1440(0-9)号段(物联网网号) (4).(460)13(移动网络识别码) 联通: (1).166(0-9)号段(公众移动通信网号)
     * (2).146(0-9)号段(物联网业务专用号段) 电信: (1).1740(0-5)号段(卫星移动通信业务号)、
     * (2).199(0-9)号段(公众移动通信网号)、 (3).1410(0-9)号段(物联网网号)、 (4).(460)59(移动网络识别码)
     * 由于物联网号段一般用在家用家具上，所以这里不考虑物联网号段,物联网号码的总位数是13或者14还没搞清楚
     * =========================================================================
     * ======================
     * 总结一下:虚拟运营商、数据卡、物联网、卫星通信、移动网络识别码都不作为正常使用的电话号码,所以需要验证的手机号如下:
     * 130、131、132、133、134(0-8)、135、136、137、138、139 149
     * 150、151、152、153、155、156、157、158、159 166、 173、175、176、177、178、
     * 180、181、182、183、184、185、186、187、188、189 198、199
     */
    private static final String REGEX_MOBILE = "(134[0-8]\\d{7})" + "|(" + "((13([0-3]|[5-9]))" + "|149"
            + "|15([0-3]|[5-9])" + "|166" + "|17(3|[5-8])" + "|18[0-9]" + "|19[8-9]" + ")" + "\\d{8}" + ")";

    /**
     * 判断是否是手机号
     * @return boolean true:是 false:否
     */
    public static boolean isMobile(String tel) {
        return Pattern.matches(REGEX_MOBILE, tel);
    }
}
