const { User, Role, Menu } = require('../models');

/**
 * 获取菜单列表
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 */
exports.getMenus = async (req, res) => {
  try {
    console.log('开始获取菜单，用户信息:', req.user);
    
    // 获取用户ID（从JWT中解析或通过其他方式获取）
    const userId = req.user?.id; // 假设通过认证中间件解析后存在
    
    console.log('用户ID:', userId);
    
    // 如果没有用户ID，返回基础菜单
    if (!userId) {
      console.log('没有用户ID，返回基础菜单');
      const menus = await Menu.findAll({
        where: {
          parent_id: null,
          show: true,
          status: 'active'
        },
        include: [
          {
            model: Menu,
            as: 'children',
            where: {
              show: true,
              status: 'active'
            },
            required: false,
            order: [['order', 'ASC']]
          }
        ],
        order: [['order', 'ASC']]
      });
      
      console.log('基础菜单查询结果:', menus.length);
      
      return res.json({
        code: 200,
        status: 'success',
        data: menus,
        message: '获取菜单成功'
      });
    }
    
    console.log('查询用户信息...');
    // 获取用户信息和角色
    const user = await User.findByPk(userId, {
      include: [
        {
          model: Role,
          as: 'role',
          attributes: ['id', 'name', 'permissions']
        }
      ]
    });
    
    console.log('用户查询结果:', user ? '找到用户' : '用户不存在');
    
    if (!user) {
      return res.status(404).json({
        code: 404,
        status: 'error',
        message: '用户不存在'
      });
    }
    
    // 获取角色的权限列表
    const userPermissions = user.role?.permissions || [];
    console.log('用户权限:', userPermissions);
    
    console.log('查询菜单数据...');
    // 查询菜单，这里简化处理，实际应用中可能需要根据权限过滤
    const menus = await Menu.findAll({
      where: {
        parent_id: null,
        show: true,
        status: 'active'
      },
      include: [
        {
          model: Menu,
          as: 'children',
          where: {
            show: true,
            status: 'active'
          },
          required: false,
          order: [['order', 'ASC']]
        }
      ],
      order: [['order', 'ASC']]
    });
    
    console.log('菜单查询结果:', menus.length);
    
    // 这里可以添加根据权限过滤菜单的逻辑
    // 简化示例，假设所有用户都能看到所有激活的菜单
    
    return res.json({
      code: 200,
      status: 'success',
      data: menus,
      message: '获取菜单成功'
    });
  } catch (error) {
    console.error('获取菜单失败:', error);
    console.error('错误堆栈:', error.stack);
    return res.status(500).json({
      code: 500,
      status: 'error',
      message: '服务器内部错误',
      error: error.message
    });
  }
};

/**
 * 获取所有菜单（包括非激活状态，仅管理员可用）
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 */
exports.getAllMenus = async (req, res) => {
  try {
    // 检查用户是否为管理员（简化示例）
    const user = await User.findByPk(req.user?.id, {
      include: [
        {
          model: Role,
          attributes: ['id', 'name', 'permissions']
        }
      ]
    });
    
    if (!user || !user.Role || !user.Role.permissions.includes('*:*')) {
      return res.status(403).json({
        code: 403,
        status: 'error',
        message: '没有权限查看所有菜单'
      });
    }
    
    // 查询所有菜单
    const menus = await Menu.findAll({
      where: {
        parent_id: null
      },
      include: [
        {
          model: Menu,
          as: 'children',
          required: false,
          order: [['order', 'ASC']]
        }
      ],
      order: [['order', 'ASC']]
    });
    
    return res.json({
      code: 200,
      status: 'success',
      data: menus,
      message: '获取所有菜单成功'
    });
  } catch (error) {
    console.error('获取所有菜单失败:', error);
    return res.status(500).json({
      code: 500,
      status: 'error',
      message: '服务器内部错误'
    });
  }
};