const NodeCache = require('node-cache');

// Cache với TTL 15 phút (900 giây) - đủ thời gian để verify email
const registrationCache = new NodeCache({
    stdTTL: 900, // 15 phút
    checkperiod: 120, // kiểm tra mỗi 2 phút để xóa expired entries
    useClones: false
});

/**
 * Lưu thông tin đăng ký vào cache
 * @param {string} key - Key để lưu (thường là email hoặc verification code)
 * @param {object} data - Dữ liệu đăng ký
 * @param {number} ttl - Thời gian sống (giây), mặc định 15 phút
 */
function setRegistrationData(key, data, ttl = 900) {
    registrationCache.set(key, data, ttl);
    console.log(`✅Registration data has been saved to the cache with the key: ${key}`);
}

/**
 * Lấy thông tin đăng ký từ cache
 * @param {string} key - Key để lấy
 * @returns {object|null} - Dữ liệu đăng ký hoặc null nếu không tồn tại
 */
function getRegistrationData(key) {
    const data = registrationCache.get(key);
    if (data) {
        console.log(`✅ Registration data has been retrieved from the cache with the key: ${key}`);
    } else {
        console.log(`❌ Registration data not found with the key: ${key}`);
    }
    return data;
}

/**
 * Xóa thông tin đăng ký khỏi cache
 * @param {string} key - Key để xóa
 */
function deleteRegistrationData(key) {
    registrationCache.del(key);
    console.log(`✅ Registration data has been deleted from the cache with the key: ${key}`);
}

/**
 * Kiểm tra xem key có tồn tại trong cache không
 * @param {string} key - Key để kiểm tra
 * @returns {boolean}
 */
function hasRegistrationData(key) {
    return registrationCache.has(key);
}

/**
 * Lấy tất cả keys trong cache (để debug)
 * @returns {array}
 */
function getAllKeys() {
    return registrationCache.keys();
}

/**
 * Xóa tất cả dữ liệu trong cache
 */
function flushAll() {
    registrationCache.flushAll();
    console.log('✅ All registration data has been deleted from the cache');
}

module.exports = {
    setRegistrationData,
    getRegistrationData,
    deleteRegistrationData,
    hasRegistrationData,
    getAllKeys,
    flushAll
};
