<?php
/**
 * Tutorials Management
 * مدیریت آموزش‌ها - سرویس‌محور: OpenVPN/L2TP، Windscribe، ExpressVPN و V2Ray
 */

namespace GemAcc;

use PDO;

class Tutorials
{
    private PDO $pdo;

    const DEVICES = ['ANDROID', 'IPHONE', 'WINDOWS'];
    const SERVICES = ['openvpn_l2tp', 'windscribe', 'expressvpn', 'v2ray'];

    public function __construct(PDO $pdo)
    {
        $this->pdo = $pdo;
    }

    public static function normalizeService(string $serviceType): string
    {
        $serviceType = strtolower(trim($serviceType));
        return in_array($serviceType, self::SERVICES, true) ? $serviceType : 'openvpn_l2tp';
    }

    public static function getServiceName(string $serviceType): string
    {
        
        $serviceType = self::normalizeService($serviceType);
        if ($serviceType === 'windscribe') return 'Windscribe';
        if ($serviceType === 'expressvpn') return 'ExpressVPN';
        if ($serviceType === 'v2ray') return 'V2Ray';
        return 'OpenVPN | L2TP';
    }

    public static function getServiceEmoji(string $serviceType): string
    {
        
        $serviceType = self::normalizeService($serviceType);
        if ($serviceType === 'windscribe') return '🟦';
        if ($serviceType === 'expressvpn') return '🚀';
        if ($serviceType === 'v2ray') return '⚡';
        return '🧊';
    }

    public function getByDevice(string $device, string $serviceType = 'openvpn_l2tp'): ?array
    {
        $device = strtoupper(trim($device));
        $serviceType = self::normalizeService($serviceType);
        if (!in_array($device, self::DEVICES, true)) return null;
        $stmt = $this->pdo->prepare("SELECT * FROM tutorials WHERE service_type = ? AND device = ? LIMIT 1");
        $stmt->execute([$serviceType, $device]);
        $row = $stmt->fetch(PDO::FETCH_ASSOC) ?: null;
        if ($row) return $row;
        if ($serviceType === 'v2ray') {
            return [
                'service_type' => 'v2ray',
                'device' => $device,
                'text_content' => self::defaultV2RayHappText($device),
                'video_file_id' => null,
                'media_file_id' => null,
                'media_type' => null,
            ];
        }
        return null;
    }

    public function getAll(?string $serviceType = null): array
    {
        if ($serviceType !== null) {
            $serviceType = self::normalizeService($serviceType);
            $stmt = $this->pdo->prepare("SELECT * FROM tutorials WHERE service_type = ? ORDER BY FIELD(device, 'ANDROID', 'IPHONE', 'WINDOWS')");
            $stmt->execute([$serviceType]);
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        }
        $stmt = $this->pdo->query("SELECT * FROM tutorials ORDER BY FIELD(service_type, 'openvpn_l2tp', 'windscribe', 'expressvpn', 'v2ray'), FIELD(device, 'ANDROID', 'IPHONE', 'WINDOWS')");
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }

    public function upsert(string $device, string $textContent, ?string $videoFileId = null, string $serviceType = 'openvpn_l2tp'): bool
    {
        $device = strtoupper(trim($device));
        $serviceType = self::normalizeService($serviceType);
        if (!in_array($device, self::DEVICES, true)) return false;
        $stmt = $this->pdo->prepare("\n            INSERT INTO tutorials (service_type, device, text_content, video_file_id, updated_at)\n            VALUES (:service_type, :device, :text, :video, NOW())\n            ON DUPLICATE KEY UPDATE\n                text_content = VALUES(text_content),\n                video_file_id = COALESCE(VALUES(video_file_id), video_file_id),\n                updated_at = NOW()\n        ");
        return $stmt->execute([':service_type'=>$serviceType, ':device'=>$device, ':text'=>$textContent, ':video'=>$videoFileId]);
    }

    public function updateVideo(string $device, string $videoFileId, string $serviceType = 'openvpn_l2tp'): bool
    {
        return $this->updateMedia($device, $videoFileId, 'video', $serviceType);
    }

    public function updateMedia(string $device, string $fileId, string $mediaType = 'video', string $serviceType = 'openvpn_l2tp'): bool
    {
        $device = strtoupper(trim($device));
        $serviceType = self::normalizeService($serviceType);
        $mediaType = strtolower(trim($mediaType));
        if (!in_array($device, self::DEVICES, true)) return false;
        if (!in_array($mediaType, ['video','photo','document'], true)) $mediaType = 'video';

        // video_file_id برای سازگاری با نسخه‌های قبلی نگه داشته می‌شود،
        // media_file_id/media_type برای پشتیبانی عکس و فایل آموزشی اضافه شده است.
        $stmt = $this->pdo->prepare("\n            INSERT INTO tutorials (service_type, device, video_file_id, media_file_id, media_type, updated_at)\n            VALUES (?, ?, ?, ?, ?, NOW())\n            ON DUPLICATE KEY UPDATE\n                video_file_id = VALUES(video_file_id),\n                media_file_id = VALUES(media_file_id),\n                media_type = VALUES(media_type),\n                updated_at = NOW()\n        ");
        return $stmt->execute([$serviceType, $device, $fileId, $fileId, $mediaType]);
    }

    public function updateText(string $device, string $textContent, string $serviceType = 'openvpn_l2tp'): bool
    {
        $device = strtoupper(trim($device));
        $serviceType = self::normalizeService($serviceType);
        if (!in_array($device, self::DEVICES, true)) return false;
        $stmt = $this->pdo->prepare("\n            INSERT INTO tutorials (service_type, device, text_content, updated_at)\n            VALUES (?, ?, ?, NOW())\n            ON DUPLICATE KEY UPDATE text_content = VALUES(text_content), updated_at = NOW()\n        ");
        return $stmt->execute([$serviceType, $device, $textContent]);
    }

    public function removeVideo(string $device, string $serviceType = 'openvpn_l2tp'): bool
    {
        $device = strtoupper(trim($device));
        $serviceType = self::normalizeService($serviceType);
        if (!in_array($device, self::DEVICES, true)) return false;
        $stmt = $this->pdo->prepare("UPDATE tutorials SET video_file_id = NULL, media_file_id = NULL, media_type = NULL WHERE service_type = ? AND device = ?");
        return $stmt->execute([$serviceType, $device]);
    }

    public function buildServiceSelectionMessage(): array
    {
        return [
            'text' => "📚 **آموزش اتصال**\n\nنوع سرویس را انتخاب کنید:",
            'keyboard' => ['inline_keyboard' => [
                [['text'=>'🧊 OpenVPN | L2TP','callback_data'=>'TUTORIAL_SERVICE_openvpn_l2tp']],
                [['text'=>'🟦 Windscribe','callback_data'=>'TUTORIAL_SERVICE_windscribe']],
                [['text'=>'🚀 ExpressVPN','callback_data'=>'TUTORIAL_SERVICE_expressvpn']],
                [['text'=>'⚡ V2Ray','callback_data'=>'TUTORIAL_SERVICE_v2ray']],
                [['text'=>'◀️ بازگشت','callback_data'=>'BACK_MAIN']],
            ]],
        ];
    }

    public function buildDeviceSelectionMessage(string $serviceType = 'openvpn_l2tp'): array
    {
        $serviceType = self::normalizeService($serviceType);
        $label = self::getServiceName($serviceType);
        $emoji = self::getServiceEmoji($serviceType);
        $text = "📚 **آموزش اتصال {$label}** {$emoji}\n\nلطفاً دستگاه خود را انتخاب کنید:";
        $prefix = 'TUTORIAL_' . $serviceType . '_';
        $keyboard = ['inline_keyboard' => [
            [
                ['text' => '📱 اندروید', 'callback_data' => $prefix.'ANDROID'],
                ['text' => '🍎 آیفون', 'callback_data' => $prefix.'IPHONE'],
            ],
            [ ['text' => '💻 ویندوز', 'callback_data' => $prefix.'WINDOWS'] ],
            [ ['text' => '◀️ بازگشت', 'callback_data' => 'TUTORIAL'] ],
        ]];
        return ['text' => $text, 'keyboard' => $keyboard];
    }

    public static function defaultV2RayHappText(string $device): string
    {
        $device = strtoupper(trim($device));
        $deviceName = self::getDeviceName($device);
        $downloadUrl = 'https://github.com/Happ-proxy/Happ/releases/latest';

        $txt  = "اپ پیشنهادی برای استفاده از کانفیگ V2Ray: HAPP

";
        $txt .= "📱 دستگاه انتخابی شما: {$deviceName}
";
        $txt .= "🔗 لینک دانلود پیش‌فرض HAPP:
{$downloadUrl}

";
        $txt .= "مراحل اتصال:
";
        $txt .= "1) لینک بالا را باز کنید و نسخه مناسب دستگاه خود را نصب کنید.
";
        $txt .= "2) برنامه HAPP را اجرا کنید.
";
        $txt .= "3) اگر QR Code دارید، داخل برنامه روی گزینه اسکن/Import by QR بزنید و QR را اسکن کنید.
";
        $txt .= "4) اگر لینک یا متن کانفیگ دارید، گزینه Import from Clipboard / Import from Link را بزنید و لینک کانفیگ را وارد کنید.
";
        $txt .= "5) بعد از اضافه شدن کانفیگ، روی Connect بزنید تا اتصال برقرار شود.

";
        $txt .= "💡 اگر برنامه از شما اجازه Clipboard یا Camera خواست، آن را تأیید کنید تا وارد کردن لینک و QR بدون مشکل انجام شود.";
        return $txt;
    }

    public static function getDeviceName(string $device): string
    {
        return ['ANDROID'=>'اندروید','IPHONE'=>'آیفون','WINDOWS'=>'ویندوز'][strtoupper($device)] ?? $device;
    }

    public static function getDeviceEmoji(string $device): string
    {
        return ['ANDROID'=>'📱','IPHONE'=>'🍎','WINDOWS'=>'💻'][strtoupper($device)] ?? '📱';
    }
}
