const jwt = require('jsonwebtoken');
const User = require('../models/User');

/**
 * Middleware bảo vệ các route yêu cầu đăng nhập.
 * Chặn quyền 'guest' (người dùng chưa đăng nhập).
 */
const protect = async (req, res, next) => {
    let token;

    if (req.headers.authorization && req.headers.authorization.startsWith('Bearer')) {
        try {
            token = req.headers.authorization.split(' ')[1];
            const decoded = jwt.verify(token, process.env.JWT_SECRET);

            req.user = await User.findById(decoded.id).select('-password');
            
            if (!req.user) {
                return res.status(401).json({ message: 'Tài khoản không tồn tại' });
            }

            return next();
        } catch (error) {
            return res.status(401).json({ message: 'Phiên làm việc hết hạn, vui lòng đăng nhập lại' });
        }
    }

    return res.status(401).json({ message: 'Vui lòng đăng nhập để sử dụng tính năng này' });
};

/**
 * Middleware xác thực tùy chọn.
 * Nếu không có token hoặc token không hợp lệ, gán role 'guest' cho req.user.
 */
const optionalAuth = async (req, res, next) => {
    let token;

    if (req.headers.authorization && req.headers.authorization.startsWith('Bearer')) {
        try {
            token = req.headers.authorization.split(' ')[1];
            const decoded = jwt.verify(token, process.env.JWT_SECRET);
            req.user = await User.findById(decoded.id).select('-password');
        } catch (error) {
            // Token lỗi, gán guest ở dưới
        }
    }

    // Logic gán Guest Role: Không lưu trong DB, chỉ tồn tại trong vòng đời Request
    if (!req.user) {
        req.user = {
            role: 'guest',
            username: 'Guest'
        };
    }

    next();
};

module.exports = { protect, optionalAuth };