package io.gisbi.application.system.service.impl;

import cn.hutool.core.util.IdUtil;
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 io.gisbi.application.system.domain.Role;
import io.gisbi.application.system.domain.User;
import io.gisbi.application.system.mapper.RoleMapper;
import io.gisbi.application.system.service.IRoleService;
import io.gisbi.utils.AuthUtils;
import io.netty.channel.ChannelInboundHandlerAdapter;
import jakarta.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.DecimalFormat;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 应用系统 服务实现类
 * </p>
 *
 * @author lilin
 * @since 2025-05-08
 */
@Service
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IRoleService {

    private static final Logger LOGGER = LoggerFactory.getLogger(ChannelInboundHandlerAdapter.class);


    @Resource
    private RoleMapper roleMapper;


    /**********************************
     * 用途说明: 根据用户id获取角色id
     * 参数说明 userid 用户id
     * 返回值说明: void
     ***********************************/
    @Override
    public List<String> getRoleUsers(String userid, String appId) {
        List<String> roleIds = roleMapper.getRoleUsers(userid, appId);
        return roleIds;
    }

    /***********************************
     * 用途说明：新增角色
     * 参数说明
     * sysRole         新增角色信息
     * 返回值说明:  是否新增成功
     ***********************************/
    @Override
    public boolean addRole(Role role) {
        //生成用户编号
        int codeMax = 0;
        DecimalFormat df = new DecimalFormat("000");//四位数字编号
        QueryWrapper<Role> 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);
        //添加角色编号
        role.setRolecode(code);
        //判断是否填写有效性 默认为 1 是
        if (StringUtils.isEmpty(role.getIsvaild())) {
            role.setIsvaild("1");
        }
        //添加最近修改者
        role.setLastmodifier(AuthUtils.getUser().getUserId().toString());
        //添加最近修改时间
        role.setLastmodifydate(LocalDateTime.now());
        return this.save(role);
    }

    /***********************************
     * 用途说明：查询所有角色
     * 参数说明
     * rolename     角色名称
     * 返回值说明:  查询都有角色
     ***********************************/
    @Override
    public List<Role> listRole(String appId, String rolename) {
        LambdaQueryWrapper<Role> queryWrapper = new LambdaQueryWrapper<>();

        queryWrapper.eq(Role::getAppId, appId);
        //根据角色名称模糊查询
        if (StringUtils.isNotEmpty(rolename)) {
            queryWrapper.like(Role::getRolename, rolename);
        }
        //根据角色类别 正序排序
        queryWrapper.orderByAsc(Role::getType,  Role::getRolecode);
        List<Role> roles = roleMapper.selectList(queryWrapper);
        return roles;
    }

    /***********************************
     * 用途说明：根据id删除角色
     * 参数说明
     *id        角色id
     * 返回值说明:  是否删除成功
     ***********************************/
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean deleteById(String id) {

        try {
            // 根据id删除角色
            boolean isOk = this.removeById(id);
            if (!isOk) {
                return false;
            }
            // 删除角色菜单关联
            roleMapper.deleteRoleMenus(id);

            // 删除角色用户关联
            roleMapper.deleteRoleUser(id);

            return true;
        } catch (Exception e) {
            // 可结合日志记录异常信息
            LOGGER.error("删除角色失败，ID: {}", id, e);
            throw e; // 抛出异常以便事务回滚
        }
    }
    /***********************************
     * 用途说明：根据ID批量删除角色
     * 参数说明
     *ids        用户id集合
     * 返回值说明: 判断是否删除成功
     ************************************/
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean deleteRoleByIds(String ids) {
        if (StringUtils.isBlank(ids)) {
            // 参数为空，直接返回失败
            return false;
        }
        final String SEPARATOR = ",";
        List<String> idList = Arrays.asList(ids.split(SEPARATOR));
        boolean allSuccess = true;

        for (String id : idList) {
            if (StringUtils.isBlank(id)) {
                // 跳过非法空ID
                continue;
            }

            // 删除角色信息
            if (!this.removeById(id)) {
                allSuccess = false;
                break;
            }

            // 删除角色菜单关联
            roleMapper.deleteRoleMenus(id);

            // 删除角色用户关联
            roleMapper.deleteRoleUser(id);
        }

        return allSuccess;
    }

    /***********************************
     * 用途说明：角色菜单权限
     * 参数说明
     * id          角色id
     * menuIds    权限id字符串
     * 返回值说明:  是否分配成功
     ***********************************/
    @Override
    public boolean setMenuByRoleId(String id, String menuIds) {
        Role role = roleMapper.selectById(id);

        // 删除角色所对应的权限
        roleMapper.deleteRoleMenus(id);
        // 重新赋予权限
        String[] ids = menuIds.split(",");
        for (String menuId : ids) {
            String uuid = IdUtil.fastSimpleUUID();
            roleMapper.addRoleMenu(uuid, role.getAppId(), id, menuId);
        }
        return true;
    }

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


}
