<?php
/**
 * YouTube Converter - Dönüştürme ve İndirme İstek API Uç Noktası (v2)
 */
require_once __DIR__ . '/../config.php';

// yt-dlp ile indirme ve dönüştürme işlemi 30 saniyeden uzun sürebileceği için zaman sınırını kaldırıyoruz.
set_time_limit(0);

header('Content-Type: application/json; charset=utf-8');

// Detaylı log fonksiyonu
function apiLog($msg) {
    $logFile = dirname(__DIR__) . '/storage/api_debug.log';
    $line = "[" . date('Y-m-d H:i:s') . "] " . $msg . "\n";
    file_put_contents($logFile, $line, FILE_APPEND);
}

apiLog("========== YENİ İSTEK ==========");
apiLog("REQUEST_METHOD: " . $_SERVER['REQUEST_METHOD']);
apiLog("RAW INPUT: " . file_get_contents('php://input'));

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo json_encode(['success' => false, 'message' => 'Geçersiz istek metodu.']);
    exit;
}

$rawInput = file_get_contents('php://input');
$input = json_decode($rawInput, true) ?? $_POST;

$url = trim($input['url'] ?? '');
$selectedFormat = trim($input['format'] ?? 'mp3_320k');

apiLog("URL: $url");
apiLog("Format: $selectedFormat");

if (empty($url)) {
    echo json_encode(['success' => false, 'message' => 'URL parametresi eksik.']);
    exit;
}

if (!filter_var($url, FILTER_VALIDATE_URL) || !preg_match('/(youtube\.com|youtu\.be)/i', $url)) {
    echo json_encode(['success' => false, 'message' => 'Geçersiz YouTube URL adresi.']);
    exit;
}

// Sistem çalışma modunu kontrol et
$adminConfig = getAdminConfig();
$systemMode = $adminConfig['system_mode'] ?? 'original';

apiLog("Sistem Modu: $systemMode");

if ($systemMode === 'api') {
    apiLog(">>> API MODU AKTİF <<<");
    
    // 1. Format eşleştirme
    $mappedFormat = 'mp3';
    if ($selectedFormat === '720p') {
        $mappedFormat = '720';
    } elseif ($selectedFormat === '480p') {
        $mappedFormat = '480';
    } elseif ($selectedFormat === 'mp3_320k') {
        $mappedFormat = 'mp3';
    } elseif ($selectedFormat === 'mp3_192k') {
        $mappedFormat = 'mp3';
    } elseif ($selectedFormat === 'm4a') {
        $mappedFormat = 'm4a';
    }

    apiLog("Mapped Format: $mappedFormat");

    // 2. loader.to download API isteği (Dönüşüm başlatma)
    $apiUrl = "https://loader.to/api/v2/download?url=" . urlencode($url) . "&format=" . $mappedFormat;
    apiLog("API URL: $apiUrl");
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $apiUrl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36');
    $res = curl_exec($ch);
    
    if (curl_errno($ch)) {
        $curlErr = curl_error($ch);
        apiLog("CURL HATASI (L1): $curlErr");
        echo json_encode([
            'success' => false,
            'message' => 'API Bağlantı Hatası (L1): ' . $curlErr
        ], JSON_UNESCAPED_UNICODE);
        exit;
    }

    apiLog("API Yanıtı (L1): $res");

    $data = json_decode($res, true);
    if (!$data || !isset($data['success']) || $data['success'] !== true || !isset($data['id'])) {
        $msg = isset($data['text']) ? $data['text'] : 'Geçersiz API yanıtı.';
        apiLog("API BAŞARISIZ (L1): $msg");
        echo json_encode([
            'success' => false,
            'message' => 'API dönüştürme başlatılamadı: ' . $msg
        ], JSON_UNESCAPED_UNICODE);
        exit;
    }

    $jobId = $data['id'];
    $title = isset($data['title']) ? $data['title'] : 'YouTube Videosu';

    apiLog("Job ID: $jobId");
    apiLog("Başlık: $title");

    // 3. loader.to progress API sorgulama (Dönüşüm durum kontrolü)
    $conversionSuccess = false;
    $downloadUrl = '';
    $maxAttempts = 100; // 100 deneme * 1.5 sn = 150 saniye max (Uzun süren dönüşümler için)
    
    for ($attempt = 0; $attempt < $maxAttempts; $attempt++) {
        $progressUrl = "https://loader.to/api/progress?id=" . urlencode($jobId);
        $ch_p = curl_init();
        curl_setopt($ch_p, CURLOPT_URL, $progressUrl);
        curl_setopt($ch_p, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch_p, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch_p, CURLOPT_TIMEOUT, 10);
        curl_setopt($ch_p, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36');
        $progRes = curl_exec($ch_p);
        $curlErrNo = curl_errno($ch_p);
        $curlErrMsg = curl_error($ch_p);
        $httpCode = curl_getinfo($ch_p, CURLINFO_HTTP_CODE);
        
        apiLog("Progress Sorgu #" . ($attempt + 1) . " - HTTP: $httpCode, cURL Hata: $curlErrNo ($curlErrMsg), Yanıt: $progRes");
        
        if (!$curlErrNo) {
            $progData = json_decode($progRes, true);
            if ($progData && isset($progData['success']) && $progData['success'] == 1 && !empty($progData['download_url'])) {
                $downloadUrl = $progData['download_url'];
                $conversionSuccess = true;
                apiLog("BAŞARILI! Download URL: $downloadUrl");
                break;
            }
            // success:0 = henüz bitmedi, bu hata DEĞİL. Sadece açık hata mesajlarında çık.
            if ($progData && isset($progData['text']) && (
                stripos($progData['text'], 'error') !== false ||
                stripos($progData['text'], 'failed') !== false ||
                stripos($progData['text'], 'not found') !== false ||
                stripos($progData['text'], 'invalid') !== false
            )) {
                $errorMsg = $progData['text'];
                apiLog("API HATASI: $errorMsg");
                break;
            }
            // Devam ediyor, bekliyoruz...
            $currentProgress = isset($progData['progress']) ? $progData['progress'] : '?';
            $currentText = isset($progData['text']) ? $progData['text'] : '?';
            apiLog("Devam ediyor... Progress: $currentProgress/1000, Text: $currentText");
        } else {
            apiLog("CURL HATASI Progress: $curlErrMsg");
        }
        
        usleep(1500000); // 1.5 saniye bekle
    }

    if (!$conversionSuccess) {
        $reason = isset($errorMsg) ? $errorMsg : 'Zaman aşımı veya API hatası.';
        apiLog("SONUÇ: BAŞARISIZ - $reason");
        echo json_encode([
            'success' => false,
            'message' => 'Dönüştürme işlemi API sunucusunda tamamlanamadı. Sebep: ' . $reason
        ], JSON_UNESCAPED_UNICODE);
        exit;
    }

    // 4. Bizim için token üret ve meta dosyasını kaydet
    $ourToken = bin2hex(random_bytes(16));
    
    file_put_contents(STORAGE_DIR . $ourToken . '.meta', json_encode([
        'title' => $title,
        'url' => $url,
        'format' => $selectedFormat,
        'is_api' => true,
        'download_url' => $downloadUrl,
        'mapped_format' => $mappedFormat
    ], JSON_UNESCAPED_UNICODE));

    logConversion($url, $selectedFormat, $ourToken);

    $responseJson = json_encode([
        'success' => true,
        'token' => $ourToken,
        'download_url' => SITE_URL . '/api/download.php?token=' . $ourToken
    ], JSON_UNESCAPED_UNICODE);
    
    apiLog("SONUÇ: BAŞARILI - Token: $ourToken, Response: $responseJson");
    echo $responseJson;
    exit;
}

apiLog(">>> ORİJİNAL MOD (yt-dlp) <<<");

// Benzersiz token üret
$token = bin2hex(random_bytes(16));
$safeUrl = escapeshellarg($url);

$bin = YTDLP_BIN;

// Sunucuyu yormamak ve YOUTUBE HIZ KISITLAMASINI (Throttle) aşmak için Android Client taklidi
$limitArgs = "-4 --no-check-certificates --extractor-args \"youtube:player_client=android,web\" --postprocessor-args \"-threads 1\"";

if (strpos($selectedFormat, 'mp3') !== false || $selectedFormat === 'm4a') {
    $extension = ($selectedFormat === 'm4a') ? 'm4a' : 'mp3';
    $outputFile = STORAGE_DIR . $token . '.' . $extension;
    $safeOutputFile = escapeshellarg($outputFile);

    if ($extension === 'mp3') {
        $quality = ($selectedFormat === 'mp3_320k') ? '0' : (($selectedFormat === 'mp3_192k') ? '2' : '5');
        $cmd = "{$bin} {$limitArgs} -x --audio-format mp3 --audio-quality {$quality} -o {$safeOutputFile} {$safeUrl} 2>&1";
    } else {
        $cmd = "{$bin} {$limitArgs} -x --audio-format m4a -o {$safeOutputFile} {$safeUrl} 2>&1";
    }
} else {
    // Video Çözünürlüğü (Örn: 1080p, 720p, 480p)
    $extension = 'mp4';
    $height = (int)str_replace('p', '', $selectedFormat);
    if ($height <= 0) {
        $height = 720;
    }

    $outputFile = STORAGE_DIR . $token . '.mp4';
    $safeOutputFile = escapeshellarg($outputFile);
    
    // Sunucu CPU'sunu kurtarmak için: Önce hazır birleşik (best) mp4 ara, bulamazsa mecbur indirip birleştir.
    $formatFilter = escapeshellarg("best[ext=mp4][height<={$height}]/bestvideo[height<={$height}]+bestaudio/best[height<={$height}]");
    $cmd = "{$bin} {$limitArgs} -f {$formatFilter} --merge-output-format mp4 -o {$safeOutputFile} {$safeUrl} 2>&1";
}

error_reporting(0);
ini_set('display_errors', 0);

// Path ve TMPDIR ayarları
$tmpDir = STORAGE_DIR . 'tmp';
$binDir = dirname(__DIR__) . '/bin';
if (!is_dir($tmpDir)) @mkdir($tmpDir, 0755, true);

// FFMPEG'in bulunabilmesi için bin/ klasörünü de PATH'e ekliyoruz
$envPath = "export TMPDIR=" . escapeshellarg($tmpDir) . "; export PATH=\$PATH:/usr/local/bin:/opt/homebrew/bin:/usr/bin:" . escapeshellarg($binDir) . ";";
$cmd = $envPath . " " . $cmd;

// Dönüştürme/İndirme komutunu çalıştır
$result = run_shell_command($cmd);
$outputLines = $result['output'];
$returnCode = $result['code'];


// İndirilen dosyayı doğrula
$finalFile = null;
foreach ([$outputFile, STORAGE_DIR . $token . '.mp3', STORAGE_DIR . $token . '.mp4', STORAGE_DIR . $token . '.m4a'] as $checkPath) {
    if (file_exists($checkPath) && filesize($checkPath) > 0) {
        $finalFile = $checkPath;
        break;
    }
}

$title = trim($input['title'] ?? '');
if (empty($title)) {
    $titleCmd = $envPath . " " . "{$bin} --get-title {$safeUrl} 2>&1";
    $tRes = run_shell_command($titleCmd);
    $title = trim($tRes['output'][0] ?? '');
}

if ($finalFile) {
    // Meta dosyasını kaydet (İndirirken gerçek video başlığını vermek için)
    file_put_contents(STORAGE_DIR . $token . '.meta', json_encode([
        'title' => $title,
        'url' => $url,
        'format' => $selectedFormat
    ], JSON_UNESCAPED_UNICODE));

    // Veritabanına kaydet
    logConversion($url, $selectedFormat, $token);

    echo json_encode([
        'success' => true,
        'token' => $token,
        'format' => pathinfo($finalFile, PATHINFO_EXTENSION),
        'download_url' => SITE_URL . '/api/download.php?token=' . $token
    ], JSON_UNESCAPED_UNICODE);
} else {

    // Başarısız olursa tüm terminal komut çıktısını sunucuya kaydet
    $logContent = "--- HATA LOGU: " . date('Y-m-d H:i:s') . " ---\n";
    $logContent .= "URL: " . $url . "\n";
    $logContent .= "Format: " . $selectedFormat . "\n";
    $logContent .= "Command: " . $cmd . "\n";
    $logContent .= "Return Code: " . $returnCode . "\n";
    $logContent .= "Çıktı:\n" . implode("\n", $outputLines) . "\n\n";
    
    file_put_contents(STORAGE_DIR . 'convert_debug.log', $logContent, FILE_APPEND);

    echo json_encode([
        'success' => false,
        'message' => 'Dönüştürme işlemi sırasında bir hata oluştu. Lütfen log dosyasını kontrol edin.'
    ], JSON_UNESCAPED_UNICODE);
}
