const axios = require('axios');
const cheerio = require('cheerio');
const ServiceModel = require('../models/ServiceModel');

class ServiceModule {

    async syncTgjuMarket() {
        const urls = {
            currency: 'https://www.tgju.org/currency',
            gold: 'https://www.tgju.org/gold-chart',
            coin: 'https://www.tgju.org/coin'
        };

        const allData = {};
        try {
            const requests = Object.entries(urls).map(async ([type, url]) => {
                try {
                    const response = await axios.get(url, {
                        timeout: 20000,
                        headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' }
                    });
                    
                    const $ = cheerio.load(response.data);
    
                    $('tr[data-market-row]').each((i, el) => {
                        const id = $(el).attr('data-market-row');
                        if (!id) return;
                        
                        // --- فیلترینگ اضافات ---
                        // حذف صندوق‌ها (که با ime_fund شروع می‌شوند)
                        // حذف حباب‌ها (که کلمه bubble در آی‌دی دارند)
                        if (id.includes('ime_fund') || id.includes('bubble')) return;
                        
                        // اگر فقط طلا، سکه، ارز و نقره رو می‌خوای، می‌تونی سخت‌گیرانه‌تر هم عمل کنی:
                        // اما فعلاً همین دو مورد اکثر زباله‌های دیتا رو پاک می‌کنه.
                    
                        const tds = $(el).find('td');
                        const name = ($(el).find('th').first().text() || '').trim();
                        
                        const price = tds.eq(0).text().trim();
                        const rawChange = tds.eq(1).text().trim();
                        const low = tds.eq(2).text().trim();
                        const high = tds.eq(3).text().trim();
                    
                        if (!name || !price || price === "0") return;
                    
                        // جدا کردن درصد و مقدار تغییر
                        let changePercent = null;
                        let changeValue = null;
                        const changeMatch = rawChange.match(/\((.*?)\)\s*(.*)/);
                        if (changeMatch) {
                            changePercent = changeMatch[1].replace('%', '').trim();
                            changeValue = changeMatch[2].trim();
                        }
                    
                        allData[id] = {
                            name,
                            price,
                            low: low || null,
                            high: high || null,
                            changeValue: changeValue || rawChange,
                            changePercent: changePercent || null,
                            type
                        };
                    });
                } catch (e) {
                    console.error(`[TGJU Fetch Error] ${type}: ${e.message}`);
                }
            });
    
            await Promise.all(requests);
    
            if (Object.keys(allData).length === 0) return false;
    
            // ذخیره در دیتابیس (اگر مدل وصل بود)
            await ServiceModel.saveMarketPrices(allData);
            
            return allData;
    
        } catch (err) {
            console.log('[Global TGJU Error]', err.message);
            return false;
        }
    }
    
}

module.exports = new ServiceModule();