package com.aiotagro.cattletrade.config;

import cn.dev33.satoken.stp.StpInterface;
import cn.dev33.satoken.stp.StpUtil;
import com.aiotagro.common.core.constant.RoleConstants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Sa-Token 权限验证接口实现
 * 
 * @author System
 * @date 2025-01-16
 */
@Slf4j
@Component
public class StpInterfaceImpl implements StpInterface {

    /**
     * 返回一个账号所拥有的权限码集合
     */
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        try {
            // 从session中获取角色ID
            Object roleIdObj = StpUtil.getTokenSession().get("roleId");
            if (roleIdObj == null) {
                log.warn("用户 {} 的roleId为空", loginId);
                return Collections.emptyList();
            }
            
            Integer roleId = Integer.parseInt(roleIdObj.toString());
            
            // 判断是否是超级管理员
            if (roleId.equals(RoleConstants.SUPER_ADMIN_ROLE_ID)) {
                log.info("用户 {} 是超级管理员，拥有所有权限", loginId);
                // 超级管理员返回通配符权限，表示拥有所有权限
                return Collections.singletonList(RoleConstants.ALL_PERMISSION);
            }
            
            // 从session中获取权限列表
            Object permissionsObj = StpUtil.getTokenSession().get("permissions");
            if (permissionsObj != null) {
                @SuppressWarnings("unchecked")
                List<String> permissions = (List<String>) permissionsObj;
                log.info("用户 {} 拥有 {} 个权限", loginId, permissions.size());
                return permissions;
            }
            
            log.warn("用户 {} 的permissions为空", loginId);
            return Collections.emptyList();
            
        } catch (Exception e) {
            log.error("获取用户权限失败: {}", e.getMessage(), e);
            return Collections.emptyList();
        }
    }

    /**
     * 返回一个账号所拥有的角色标识集合 (权限与角色可分开校验)
     */
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        try {
            // 从session中获取角色编码
            Object roleCodeObj = StpUtil.getTokenSession().get("roleCode");
            if (roleCodeObj != null) {
                String roleCode = roleCodeObj.toString();
                List<String> roleList = new ArrayList<>();
                roleList.add(roleCode);
                
                // 如果是超级管理员，额外添加admin标识
                Object roleIdObj = StpUtil.getTokenSession().get("roleId");
                if (roleIdObj != null) {
                    Integer roleId = Integer.parseInt(roleIdObj.toString());
                    if (roleId.equals(RoleConstants.SUPER_ADMIN_ROLE_ID)) {
                        roleList.add("admin");
                        roleList.add("super_admin");
                    }
                }
                
                log.info("用户 {} 的角色: {}", loginId, roleList);
                return roleList;
            }
            
            log.warn("用户 {} 的roleCode为空", loginId);
            return Collections.emptyList();
            
        } catch (Exception e) {
            log.error("获取用户角色失败: {}", e.getMessage(), e);
            return Collections.emptyList();
        }
    }
}

