const express = require('express');
const axios = require('axios');
const vm = require('vm'); // وحدة Node.js مضمنة لحل JavaScript
const app = express();
const PORT = process.env.PORT || 3000; 

// دالة لمعالجة المنطق الأساسي (منع التكرار)
async function handleResolverRequest(req, res) {
    const targetUrl = req.query.url;

    if (!targetUrl) {
        // ... (رسالة الترحيب كما هي)
        const pathBase = req.path === '/' ? '' : req.path;
        return res.status(200).send(`
            <h1>Cloudflare Legacy Resolver Service Running</h1>
            <p><strong>Status:</strong> Awaiting URL.</p>
            <p><strong>Instructions:</strong> Use a GET request with the 'url' query parameter.</p>
            <p><strong>Example:</strong> ${req.protocol}://${req.get('host')}${pathBase}?url=https%3A%2F%2Fak.sv%2Fseries%2F5052%2F...</p>
        `);
    }

    const headers = {
        // استخدم User-Agent أحدث قليلاً
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36'
    };
    
    // استخراج الدومين
    const urlParts = new URL(targetUrl);
    const domain = urlParts.host;

    try {
        // 1. الطلب الأول: توقع الحصول على صفحة التحدي (HTTP 503)
        let response = await axios.get(targetUrl, { headers, maxRedirects: 0, validateStatus: status => status === 503 || status === 200 });

        // ... (بقية منطق استخراج التحدي وحله كما هو)
        if (response.status === 200 || !response.data.includes('jschl-vc')) {
            res.set('Content-Type', 'text/html');
            return res.send(response.data);
        }
        
        const html = response.data;
        const jschl_vc = html.match(/name="jschl-vc" value="([^"]*)"/)?.[1];
        const pass = html.match(/name="pass" value="([^"]*)"/)?.[1];
        const challenge_js_match = html.match(/var s,t,o,p,b,r,e,a,k,i,n,g,f,.*?'\n? (.*)\n/);
        const challenge_js = challenge_js_match ? challenge_js_match[1] : null;

        if (!jschl_vc || !pass || !challenge_js) {
            return res.status(500).send("Resolution Error: Failed to extract Cloudflare challenge data.");
        }

        let challengeSolution = null;
        try {
            let jsCode = challenge_js.replace(/a\.value = (.+?);/s, '$1'); 
            jsCode = jsCode.replace(/\s\s+g/g, ''); 
            
            const sandbox = { t: domain, s: 0 }; // استخدام الدومين المستخرج
            const vm = require('vm');
            vm.createContext(sandbox);
            vm.runInContext(`s = ${jsCode}`, sandbox, { timeout: 5000 });
            challengeSolution = sandbox.s;

        } catch (e) {
            console.error("VM Execution Error:", e);
            return res.status(500).send("Resolution Error: JavaScript challenge solving failed.");
        }

        const solutionValue = (challengeSolution + domain.length).toFixed(10);
        
        const challengeUrl = `https://${domain}/cdn-cgi/l/chk_jschl?jschl_vc=${jschl_vc}&pass=${pass}&jschl_answer=${solutionValue}`;

        // 5. الطلب الثاني: إرسال الحل والحصول على الكوكي
        response = await axios.get(challengeUrl, { 
             headers: {
                 ...headers,
                 // إضافة رأس Referer
                 'Referer': targetUrl 
             }, 
             maxRedirects: 0, 
             validateStatus: status => status === 302 || status === 200 
        });
        
        const cf_clearance_cookie = response.headers['set-cookie']?.find(c => c.startsWith('cf_clearance=')) || '';

        if (!cf_clearance_cookie) {
             return res.status(500).send("Resolution Error: Did not receive cf_clearance cookie.");
        }

        // 6. الطلب الثالث: جلب الصفحة النهائية باستخدام الكوكي ورأس Referer
        const finalHeaders = {
            'User-Agent': headers['User-Agent'],
            'Cookie': cf_clearance_cookie.split(';')[0],
            // إضافة رأس Referer في الطلب النهائي أيضاً
            'Referer': targetUrl
        };

        response = await axios.get(targetUrl, { headers: finalHeaders });
        
        res.set('Content-Type', 'text/html');
        res.send(response.data);

    } catch (error) {
        console.error('Final Cloudflare bypass failed:', error.message);
        const errorMessage = error.response ? `Status ${error.response.status}` : error.message;
        // إذا كان الخطأ 403، نضيف توضيحاً
        if (error.response && error.response.status === 403) {
            return res.status(500).send(`Final Resolution Error: Status 403 Forbidden. The legacy bypass failed, likely due to a new Cloudflare challenge type (Managed or Captcha).`);
        }
        return res.status(500).send(`Final Resolution Error: ${errorMessage}`);
    }
}

// ------------------------------------------
// تعيين المسارات (كما في الإصدار السابق الذي يعمل)
// ------------------------------------------

app.get('/', handleResolverRequest);
app.get('/cloudflare', handleResolverRequest);
app.get('/cloudflare/resolve', handleResolverRequest);

// 4. معالج الأخطاء لـ 404
app.use((req, res, next) => {
    res.status(404).send(`Error: Cannot GET ${req.originalUrl}. Please use one of the defined endpoints with the 'url' query parameter (e.g., /cloudflare?url=...).`);
});

app.listen(PORT, () => {
    console.log(`Cloudflare Resolver service started.`);
});