package lingtao.net.service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import lingtao.net.bean.Msg;
import lingtao.net.bean.SysUser;
import lingtao.net.dao.SysUserMapper;
import lingtao.net.util.MD5Util;

@Service
public class SysUserService {

    @Autowired
    private SysUserMapper userMapper;

    // 注册
    public Msg register(SysUser user) {
        user.setPassword(new MD5Util().md5(user.getPassword(), "lingtao"));
        user.setCreateDate(new Date());
        // 注册的用户都是未激活状态
        user.setUserStatus("0");
        // 注册的用户都是系统功能隐藏状态
        user.setSysStatus("0");
        // 注册的用户不需要判断IP
        user.setNeedIp("1");
        String roleId = user.getRole();
        if (StringUtils.isEmpty(roleId))
            return null;
        // 给用户赋予角色
        user.setRole("999," + roleId);
        // user.setRole("999");
        // Integer[] ids = {999};
        int count = userMapper.insertSelective(user);
        // 根据角色的id把角色的权限给用户
        Integer[] ids = {999, Integer.valueOf(roleId)};
        // 新增用户后会自动回补id
        Integer userId = user.getUserId();
        userMapper.addUserRoles(userId, ids);
        if (count < 0) {
            return Msg.fail();
        }
        return Msg.success();
    }

    public List<SysUser> getUsers(SysUser user) {
        // 用户所拥有的角色
        String[] roleArr = user.getRole().split(",");
        // 转成list，拿掉‘组长’身份
        List<String> list = new ArrayList<String>(Arrays.asList(roleArr));
        // 判断是否拥有超管身份标识
        boolean isSuper = false;
        for (int i = 0; i < roleArr.length; i++) {
            // 有‘超级管理员’身份,状态改为true
            if ("1".equals(roleArr[i])) {
                isSuper = true;
                break;
            }

            // 如果有【店长/考试审核员/客服/组长/IP管理员/操作日志/不填旺旺】身份，去掉。不带去查询
            if ("666".equals(roleArr[i]) || "888".equals(roleArr[i]) || "999".equals(roleArr[i])
                    || "1011".equals(roleArr[i]) || "1015".equals(roleArr[i]) || "1042".equals(roleArr[i])
                    || "1049".equals(roleArr[i])) {
                list.remove(roleArr[i]);
            }
        }
        // 将list转为String[] 数组
        roleArr = list.toArray(new String[list.size()]);

        // 如果没有‘超级管理员’身份，只能看到负责的部门的用户；如果有可以看到所有用户
        if (!isSuper) {
            // 如果是通过‘用户角色’查询
            if (StringUtils.isNotEmpty(user.getRoleSearch())) {
                // 清除自己拥有的角色,防止查询出所有的部门数据
                roleArr = null;
            }
            // 如果有多个
            if (user.getRole().contains(",")) {
                user.setRoleArr(roleArr);
            } else {// 只有一个角色
                user.setRoleSearch(user.getRole());
            }
        }

        return userMapper.getUsers(user);
    }

    // 检查用户名是否存在
    public Msg checkUsername(String username) {
        SysUser user = userMapper.getUserByUsername(username);
        if (user != null) {
            return Msg.fail();
        }
        return Msg.success();
    }

    // 新增
    public Msg addUser(SysUser user) {
        user.setPassword(new MD5Util().md5(user.getPassword(), "lingtao"));
        user.setCreateDate(new Date());
        user.setSysStatus("2");
        try {
            userMapper.insertSelective(user);
            return Msg.success();
        } catch (Exception e) {
            return Msg.fail();
        }
    }

    // 修改
    public Msg updateUserById(SysUser user) {
        if (!"********".equals(user.getPassword())) { // 如果改过密码
            user.setPassword(new MD5Util().md5(user.getPassword(), "lingtao"));
        } else {
            user.setPassword(null);
        }
        // 如果有【店长】身份，更改的角色前面添加【客服】
        SysUser user2 = (SysUser) SecurityUtils.getSubject().getPrincipal();
        boolean flag = false;
        String[] role = user2.getRole().split(",");
        for (int i = 0; i < role.length; i++) {
            if ("666".equals(role[i])) {
                flag = true;
                break;
            }
        }
        if (flag) {
            user.setRole("999," + user.getRole());
        }
        user.setUpdateDate(new Date());
        try {
            userMapper.updateByPrimaryKeySelective(user);
            return Msg.success();
        } catch (Exception e) {
            return Msg.fail();
        }
    }

    // 删除用户
    public Msg deleteUserById(Integer userId) {
        try {
            userMapper.deleteByPrimaryKey(userId);
            return Msg.success();
        } catch (Exception e) {
            return Msg.fail("主外键关联，删除失败!");
        }
    }

    // 改变用户状态
    public Msg changeUserStatus(Integer userId) {
        try {
            userMapper.changeUserStatus(userId);
            return Msg.success();
        } catch (Exception e) {
            return Msg.fail();
        }
    }

    public void addUserRoles(Integer userId, Integer[] ids) {
        userMapper.addUserRoles(userId, ids);
    }

    public void deleteUserRoles(Integer userId) {
        userMapper.deleteUserRoles(userId);
    }

    public Msg updatePassword(SysUser user) {
        user.setPassword(new MD5Util().md5(user.getPassword(), "lingtao"));
        int i = userMapper.updateByPrimaryKeySelective(user);
        if (i > 0) {
            return Msg.success();
        }
        return Msg.fail();
    }

    public Msg addBirthDay(SysUser user) {
        SysUser sysUser = (SysUser) SecurityUtils.getSubject().getPrincipal();
        user.setUserId(sysUser.getUserId());
        user.setIsBirthDay(0);
        int i = userMapper.updateByPrimaryKeySelective(user);
        if (i > 0) {
            return Msg.success();
        }
        return Msg.fail();
    }

    // 改变用户生日状态
    public Msg changeIsBirthDay(Integer userId) {
        try {
            userMapper.changeIsBirthDay(userId);
            return Msg.success();
        } catch (Exception e) {
            return Msg.fail();
        }
    }

    public Msg changeNeedIp() {
        try {
            userMapper.changeNeedIp();
            return Msg.success();
        } catch (Exception e) {
            return Msg.fail();
        }
    }

    // 改变用户系统状态（管理员调整）
    public Msg changeSysStatus(Integer userId) {
        try {
            userMapper.changeSysStatus(userId);
            return Msg.success();
        } catch (Exception e) {
            return Msg.fail();
        }
    }

    // 改变用户系统状态（看完视频）
    public Msg videoOverToChangeSysStatus(Integer userId) {
        try {
            userMapper.videoOverToChangeSysStatus(userId);
            return Msg.success();
        } catch (Exception e) {
            return Msg.fail();
        }
    }

    // 改变用户系统状态（答题通过）
    public Msg examOverToChangeSysStatus(Integer userId) {
        try {
            userMapper.examOverToChangeSysStatus(userId);
            return Msg.success();
        } catch (Exception e) {
            return Msg.fail();
        }
    }

    // 改变阅读更新日志状态
    public Msg changeReadLogStatus(Integer userId) {
        try {
            userMapper.changeReadLogStatus(userId);
            return Msg.success();
        } catch (Exception e) {
            return Msg.fail();
        }
    }

    public SysUser getUserInfo(Integer userId) {
        try {
            return userMapper.getUserInfo(userId);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 客服数据 -- 根据搜索的店铺获取人员
     *
     * @return
     */
    public List<SysUser> getRealnamesByShopname(String shopname) {
        return userMapper.getRealnamesByShopname(shopname);
    }

}
