/**
 * 类目数据加载器
 * 采用"线上获取 + 本地缓存"策略
 */
class CategoryLoader {
    constructor() {
        this.CACHE_KEY = 'aliexpress_category_full_data';
        this.META_KEY = 'aliexpress_category_meta'; // 用于存版本号或时间戳
        this.REMOTE_URL = 'https://www.3qniuma.com/files/category-data.json'; // 线上数据地址
        this.ONE_DAY = 24 * 60 * 60 * 1000; // 一天的毫秒数
    }

    /**
     * 获取类目数据（对外调用的主方法）
     * 逻辑：
     * 1. 检查本地缓存
     * 2. 如果有缓存，直接返回。同时检查是否过期，过期则后台静默更新。
     * 3. 如果无缓存（首次启动），直接请求线上数据并缓存。
     */
    async getData() {
        try {
            // 1. 尝试从 chrome.storage.local 读取
            const cache = await this.getFromStorage(this.CACHE_KEY);
            const meta = await this.getFromStorage(this.META_KEY);
            
            const now = Date.now();

            if (cache) {
                console.log('✅ [CategoryLoader] 使用本地缓存的类目数据');
                
                // 检查是否过期（每天更新一次）
                if (!meta || (now - meta.updateTime > this.ONE_DAY)) {
                    console.log('⏳ [CategoryLoader] 缓存已过期，后台静默更新...');
                    this.fetchAndCacheRemoteData().catch(err => console.warn('后台更新失败:', err));
                }
                
                return cache;
            }

            // 2. 无缓存（首次启动），强制请求线上
            console.log('🚀 [CategoryLoader] 首次启动，正在下载全量类目数据...');
            const remoteData = await this.fetchAndCacheRemoteData();
            return remoteData;

        } catch (error) {
            console.error('❌ [CategoryLoader] 获取类目数据失败:', error);
            // 如果失败，返回空对象或抛出，取决于业务需求
            return null;
        }
    }

    /**
     * 请求线上数据并写入缓存
     */
    async fetchAndCacheRemoteData() {
        try {
            // 使用 background script 绕过 CORS
            const data = await new Promise((resolve, reject) => {
                chrome.runtime.sendMessage({ 
                    action: 'fetchCategoryData', 
                    url: this.REMOTE_URL 
                }, response => {
                    if (chrome.runtime.lastError) {
                        // 如果没有 background listener (例如插件未重载)，可能报错
                        return reject(chrome.runtime.lastError);
                    }
                    if (response && response.success) {
                        resolve(response.data);
                    } else {
                        reject(new Error(response ? response.error : 'Unknown error'));
                    }
                });
            });
            
            // 写入缓存
            await this.saveToStorage({
                [this.CACHE_KEY]: data,
                [this.META_KEY]: { updateTime: Date.now() }
            });
            
            console.log('⬇️ [CategoryLoader] 类目数据已同步并缓存');
            return data;
        } catch (error) {
            console.error('☁️ [CategoryLoader] 线上数据请求失败:', error);
            console.log('📂 [CategoryLoader] 尝试加载本地兜底数据...');
            return this.loadLocalFile();
        }
    }

    /**
     * 加载本地兜底文件
     */
    async loadLocalFile() {
        try {
            const url = chrome.runtime.getURL('init/速卖通类目数据.json');
            const response = await fetch(url);
            const data = await response.json();
            console.log('✅ [CategoryLoader] 已加载本地兜底数据');
            return data;
        } catch (e) {
            console.error('❌ [CategoryLoader] 本地数据加载失败:', e);
            return null;
        }
    }

    /**
     * Promise 封装 storage.get
     */
    getFromStorage(key) {
        return new Promise((resolve) => {
            chrome.storage.local.get(key, (result) => {
                resolve(result[key]);
            });
        });
    }

    /**
     * Promise 封装 storage.set
     */
    saveToStorage(data) {
        return new Promise((resolve) => {
            chrome.storage.local.set(data, () => {
                resolve();
            });
        });
    }
}

// 导出单例
window.categoryLoader = new CategoryLoader();
