const express = require('express');
const mysql = require('mysql2/promise');
const cors = require('cors');
const app = express();

// --- 1. إعدادات الاتصال بقاعدة البيانات ---
// (نفس البيانات الموجودة في config.php)
const dbConfig = {
    host: 'localhost',
    user: 'sitegeeky_app',      // اسم المستخدم
    password: 'appscoretank281243', // كلمة المرور
    database: 'sitegeeky_appscoretank', // اسم القاعدة
    waitForConnections: true,
    connectionLimit: 10,
    queueLimit: 0
};

const pool = mysql.createPool(dbConfig);
const DB_PREFIX = 'wp47_'; // بادئة الجداول

app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// --- 2. دالة التحقق من التوكن (مترجمة من PHP) ---
async function isValidToken(req) {
    const token = req.query.token || req.body.token;
    const domain = req.query.domain || req.body.domain;

    if (!token || !domain) return false;

    try {
        const [rows] = await pool.execute('SELECT user_domain, expires_at FROM api_tokens WHERE token = ? LIMIT 1', [token]);
        
        if (rows.length > 0) {
            const dbDomain = rows[0].user_domain.replace(/^www\./, '').trim();
            
            // تطبيع الدومين القادم من الطلب (إزالة http/https و www والشرطة النهائية)
            let requestDomain = domain.replace(/^https?:\/\//, '').replace(/\/$/, '').replace(/^www\./, '').trim();

            if (dbDomain === requestDomain) {
                // تحقق إضافي: هل التوكن منتهي الصلاحية؟
                const expiresAt = new Date(rows[0].expires_at);
                const now = new Date();
                if (expiresAt < now) return 'expired';

                return true;
            }
        }
    } catch (error) {
        console.error("Token Validation Error:", error);
    }
    return false;
}

// middleware للتحقق من التوكن قبل أي طلب
const checkAuth = async (req, res, next) => {
    // استثناء SSE من الرد المباشر بـ 403، سنتعامل معه داخله لإبقاء الاتصال نظيفاً
    if (req.path === '/sse') {
        return next(); 
    }

    const valid = await isValidToken(req);
    if (valid === true) {
        next();
    } else if (valid === 'expired') {
        res.json({ success: false, message: 'الاشتراك منتهي. يرجى التجديد.' });
    } else {
        res.status(403).json({ success: false, message: 'التوكن أو النطاق غير صالح.' });
    }
};

// --- 3. نقاط النهاية (API Endpoints) ---

// أ) فحص الترخيص (Check License)
app.get('/check_license', async (req, res) => {
    const valid = await isValidToken(req);
    if (valid === true) {
        // جلب تفاصيل التوكن
        const [rows] = await pool.execute('SELECT created_at, expires_at FROM api_tokens WHERE token = ?', [req.query.token]);
        res.json({
            success: true,
            data: { status: 'valid', created_at: rows[0].created_at, expires_at: rows[0].expires_at }
        });
    } else if (valid === 'expired') {
        res.json({ success: false, data: { status: 'expired', message: 'الاشتراك منتهي.' } });
    } else {
        res.json({ success: false, data: { status: 'invalid', message: 'بيانات التوكن غير موجودة.' } });
    }
});

// ب) جلب المباريات الحديثة (Recent Matches)
app.get('/matches', checkAuth, async (req, res) => {
    try {
        const [rows] = await pool.query(`
            SELECT match_id, league, date, time, timer, team1, team2, 
                   team1_logo, team2_logo, score, status, channels,
                   team1_pen_score, team2_pen_score, stadium
            FROM ${DB_PREFIX}matches 
            ORDER BY date DESC, time DESC
        `);

        // تحويل القنوات من نص إلى مصفوفة
        const matches = rows.map(m => ({
            ...m,
            channels: m.channels ? m.channels.split(',') : []
        }));

        res.json({ success: true, data: matches });
    } catch (error) {
        console.error(error);
        res.status(500).json({ success: false, message: 'خطأ في الخادم' });
    }
});

// ج) جلب تفاصيل مباراة (Match Details)
app.get('/match/:id', checkAuth, async (req, res) => {
    try {
        const matchId = req.params.id;
        const [rows] = await pool.execute(`
            SELECT m.*, md.lineups, md.events, md.statistics
            FROM ${DB_PREFIX}matches m
            LEFT JOIN ${DB_PREFIX}match_details md ON m.match_id = md.match_id
            WHERE m.match_id = ?
        `, [matchId]);

        if (rows.length === 0) {
            return res.json({ success: false, message: 'المباراة غير موجودة' });
        }

        const match = rows[0];
        // فك ترميز JSON المخزن في القاعدة
        match.lineups = JSON.parse(match.lineups || '[]');
        match.events = JSON.parse(match.events || '[]');
        match.statistics = match.statistics ? JSON.parse(match.statistics) : null;
        match.channels = match.channels ? match.channels.split(',') : [];

        res.json({ success: true, data: match });
    } catch (error) {
        console.error(error);
        res.status(500).json({ success: false, message: 'خطأ في الخادم' });
    }
});

// د) نظام SSE (التحديث اللحظي الذكي) - نسخة مصححة (تشمل الوقت)
app.get('/sse', async (req, res) => {
    res.setHeader('Content-Type', 'text/event-stream');
    res.setHeader('Cache-Control', 'no-cache');
    res.setHeader('Connection', 'keep-alive');
    res.setHeader('Access-Control-Allow-Origin', '*');

    const valid = await isValidToken(req);
    if (valid !== true) {
        res.write(`data: ${JSON.stringify({ error: 'Unauthorized' })}\n\n`);
        return res.end();
    }

    const matchId = req.query.match_id;
    let lastUpdate = 0;

    const checkForUpdates = async () => {
        try {
            let query, params;
            
            if (matchId) {
                // مراقبة مباراة واحدة (تم إضافة m.time هنا)
                query = `
                    SELECT m.match_id, m.status, m.score, m.timer, m.time, m.updated_at,
                           m.team1_pen_score, m.team2_pen_score, m.stadium,
                           md.lineups, md.events, md.statistics
                    FROM ${DB_PREFIX}matches m
                    LEFT JOIN ${DB_PREFIX}match_details md ON m.match_id = md.match_id
                    WHERE m.match_id = ? AND m.updated_at > FROM_UNIXTIME(?)
                `;
                params = [matchId, lastUpdate];
            } else {
                // مراقبة القائمة الرئيسية (تم إضافة time هنا)
                query = `
                    SELECT match_id, status, score, timer, time, team1_score, team2_score, 
                           team1_pen_score, team2_pen_score, stadium, channels, updated_at 
                    FROM ${DB_PREFIX}matches 
                    WHERE updated_at > FROM_UNIXTIME(?)
                `;
                params = [lastUpdate];
            }

            const [rows] = await pool.execute(query, params);

            if (rows.length > 0) {
                const maxTime = rows.reduce((max, r) => Math.max(max, new Date(r.updated_at).getTime() / 1000), lastUpdate);
                lastUpdate = maxTime;

                const dataToSend = rows.map(r => {
                    // فك ترميز JSON إذا لزم الأمر
                    if (r.lineups && typeof r.lineups === 'string') r.lineups = JSON.parse(r.lineups);
                    if (r.events && typeof r.events === 'string') r.events = JSON.parse(r.events);
                    if (r.statistics && typeof r.statistics === 'string') r.statistics = JSON.parse(r.statistics);
                    if (r.channels && typeof r.channels === 'string') r.channels = r.channels.split(',');
                    return r;
                });

                res.write(`event: update\n`);
                res.write(`data: ${JSON.stringify(dataToSend)}\n\n`);
            } else {
                res.write(`: keep-alive\n\n`);
            }

        } catch (error) {
            console.error("SSE Error:", error);
        }
    };

    const intervalId = setInterval(checkForUpdates, 3000);
    req.on('close', () => { clearInterval(intervalId); });
});

// تشغيل الخادم
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server running on port ${PORT}`);
});
