const { Menu, Member } = require('../models');
const { Op } = require('sequelize');

/**
 * 사용자의 접근 가능한 메뉴 목록을 반환합니다.
 */
exports.getUserMenus = async (req, res) => {
  try {
    const { clubId, role = 'user' } = req.body;
    const userId = req.user.id; // JWT 토큰에서 사용자 ID 가져오기

    if (!clubId) {
      return res.status(400).json({
        success: false,
        message: '클럽 ID가 필요합니다.'
      });
    }

    // 멤버 정보 조회
    const member = await Member.findOne({
      where: {
        clubId,
        userId
      }
    });

    const menus = await getAccessibleMenus(clubId, role, member);
    
    res.json({
      success: true,
      data: menus
    });
  } catch (error) {
    console.error('메뉴 조회 중 오류 발생:', error);
    res.status(500).json({
      success: false,
      message: '메뉴 조회 중 오류가 발생했습니다.'
    });
  }
}

/**
 * 사용자 권한과 클럽의 구독/기능 상태에 따라 접근 가능한 메뉴 목록을 조회합니다.
 */
const { clubHasFeature } = require('../utils/featureAccess');

async function getAccessibleMenus(clubId, userRole, member) {
  // 1. 모든 visible 메뉴 조회
  const allMenus = await Menu.findAll({ where: { visible: true }, order: [['order', 'ASC']] });

  // 2. 각 메뉴별로 featureCode가 있으면 clubHasFeature로 체크
  async function isAccessible(menu) {
    if (!menu.featureCode) return true;
    return await clubHasFeature(clubId, menu.featureCode);
  }

  // 3. 트리 구조로 접근 가능한 메뉴만 반환
  async function buildMenuTree(parentId = null) {
    const filteredMenus = [];
    for (const menu of allMenus.filter(m => m.parentId === parentId)) {
      if (await isAccessible(menu)) {
        const children = await buildMenuTree(menu.id);
        filteredMenus.push({ ...menu.toJSON(), children });
      }
    }
    return filteredMenus;
  }

  return await buildMenuTree();
}

exports.getAccessibleMenus = getAccessibleMenus;