package com.yfd.platform.system.service.impl;

import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yfd.platform.system.domain.RolePatroldevice;
import com.yfd.platform.system.domain.SysRole;
import com.yfd.platform.system.mapper.RolePatroldeviceMapper;
import com.yfd.platform.system.mapper.SysRoleMapper;
import com.yfd.platform.system.service.IRolePatroldeviceService;
import com.yfd.platform.system.service.ISysRoleService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * <p>
 * 系统角色 服务实现类
 * </p>
 *
 *
 * @since 2021-12-15
 */
@Service
@Transactional
public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements ISysRoleService {

    @Resource
    private SysRoleMapper roleMapper;

    @Resource
    private UserServiceImpl currentuser;

    @Resource
    private IRolePatroldeviceService rolePatroldeviceService;

    /***********************************
     * 用途说明：新增角色
     * 参数说明
     * sysRole         新增角色信息
     * 返回值说明:  是否新增成功
     ***********************************/
    @Override
    public boolean addRole(SysRole sysRole) {
        //生成用户编号
        int codeMax = 0;
        DecimalFormat df = new DecimalFormat("000");//四位数字编号
        QueryWrapper<SysRole> queryWrapper = new QueryWrapper<>();
        List<Object> max = this.listObjs(queryWrapper.select("MAX(rolecode) " +
                "rolecode"));// 查询最大的编号
        if (max.size() > 0) {
            codeMax = Integer.parseInt(max.get(0).toString());//判断查询是否存在
        }
        // 存在转换成int类型并给codeMax替换值
        String code = df.format(codeMax + 1);       // 最大编号累加

        sysRole.setRolecode(code);          //添加角色编号
        if (StringUtils.isEmpty(sysRole.getIsvaild())) {
            sysRole.setIsvaild("1");        //判断是否填写有效性 默认为 1 是
        }
        sysRole.setLastmodifier(currentuser.getUsername());      //添加最近修改者
        sysRole.setLastmodifydate(new Timestamp(System.currentTimeMillis()));         //添加最近修改时间
        return this.save(sysRole);
    }

    /***********************************
     * 用途说明：删除角色用户（admin除外）
     * 参数说明
     * id       系统角色用户对照表id
     * 返回值说明:  是否新增成功
     ***********************************/
    @Transactional(rollbackFor = Exception.class)
    @Override
    public boolean deleteRoleUsers(String roleid, String urserids) {
        boolean ok = true;
        //得到单个用户id
        String[] temp = urserids.split(",");
        for (String userid : temp) {
            //根据角色id、用户id删除 （登录账号admin除外）
            ok = ok && roleMapper.deleteRoleUsers(roleid, userid);

        }
        roleMapper.deleteById(roleid);
        return ok;
    }

    /***********************************
     * 用途说明：根据id删除角色  //待修改
     * 参数说明
     *id        角色id
     * 返回值说明:  是否删除成功
     ***********************************/
    @Override
    public void deleteById(String id) {
        String[] ids = id.split(",");
        for (String roleId : ids) {
            //根据id删除 角色
            boolean isOk = this.removeById(roleId);
            if (!isOk) {
                continue;
            }
            roleMapper.deleteRoleMenus(roleId);
            roleMapper.deleteRoleUser(roleId);
        }
    }
    /* 原逻辑
    @Override
    public boolean deleteById(String id) {
        //根据角色id查询 所关联的用户
        List<Map<String, String>> isRoleUsersByroleid =
                roleMapper.isRoleUsersByroleid(id);
        //判断是否关联用户
        if (isRoleUsersByroleid.size() > 0) {
            return false;
        }
        //根据id删除 角色
        boolean isOk = this.removeById(id);
        if (isOk) {
            return true;
        }
        return false;
    }*/

    /***********************************
     * 用途说明：查询已分配的用户
     * 参数说明
     *orgid         所属组织
     *username      用户名称
     *status        状态
     *level         角色级别
     * rolename     角色名称
     * isvaild      角色是否有效
     * 返回值说明:  系统用户角色数据集合
     ***********************************/
    @Override
    public List<Map> listRoleUsers(String orgid, String username,
                                   String status, String level,
                                   String rolename, String isvaild) {
        return roleMapper.listRoleUsers(orgid, username, status, level,
                rolename, isvaild);
    }

    /***********************************
     * 用途说明：角色分配权限
     * 参数说明
     * id          角色id
     * menuIds    权限id字符串
     * 返回值说明:  是否分配成功
     ***********************************/
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean setMenuById(String id, String menuIds) {
        // 删除角色所对应的权限
        roleMapper.deleteRoleMenus(id);
        // 重新赋予权限
        String[] ids = menuIds.split(",");
        for (String menuId : ids) {
            String uuid = IdUtil.fastSimpleUUID();
            roleMapper.addRoleMenu(uuid, id, menuId);
        }
        return true;
    }

    /**********************************
     * 用途说明: 角色分配摄像头
     * 参数说明 id 角色id
     * 参数说明 deviceIds 摄像头id
     * 返回值说明: void
     ***********************************/
    @Override
    public void setPatrolDevice(String id, String deviceIds) {
        LambdaQueryWrapper<RolePatroldevice> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(RolePatroldevice::getRoleid, id);
        List<RolePatroldevice> list = rolePatroldeviceService.list(queryWrapper);
        if (list != null && list.size() > 0) {
            Set<String> collect = list.stream().map(RolePatroldevice::getId).collect(Collectors.toSet());
            rolePatroldeviceService.removeByIds(collect);
        }
        String[] ids = deviceIds.split(",");
        List<RolePatroldevice> patroldeviceList = new ArrayList<>();
        if (ids.length > 0) {
            for (String deviceId : ids) {
                if (StrUtil.isBlank(deviceId)) {
                    continue;
                }
                RolePatroldevice rolePatroldevice = new RolePatroldevice();
                rolePatroldevice.setRoleid(id);
                rolePatroldevice.setDeviceid(deviceId);
                patroldeviceList.add(rolePatroldevice);
            }
            rolePatroldeviceService.saveBatch(patroldeviceList);
        }
    }

}
