<?php
/**
 * YouTube Converter - Güvenli Dosya İndirme API Uç Noktası
 */
require_once __DIR__ . '/../config.php';

$token = preg_replace('/[^a-f0-9]/', '', $_GET['token'] ?? '');

if (empty($token)) {
    http_response_code(400);
    die('Hata: Geçersiz veya eksik indirme tokeni.');
}

// Eğer API modu ile oluşturulmuş bir meta dosyası varsa (loader.to Proxy Akışı)
$metaFile = STORAGE_DIR . $token . '.meta';
if (file_exists($metaFile)) {
    $metaData = json_decode(file_get_contents($metaFile), true);
    if (isset($metaData['is_api']) && $metaData['is_api'] === true) {
        $downloadUrl = $metaData['download_url'];
        
        // Çıktı arabelleklerini tamamen temizle
        if (ob_get_level()) {
            ob_end_clean();
        }

        // Dosya adı temizleme
        $cleanTitle = preg_replace('/[^\p{L}\p{N}\s\-\_\.\(\)]/u', '', $metaData['title']);
        $cleanTitle = trim(preg_replace('/\s+/', ' ', $cleanTitle));
        if (empty($cleanTitle)) {
            $cleanTitle = 'youtube_media_' . substr($token, 0, 8);
        }

        $ext = ($metaData['mapped_format'] === 'mp4' || $metaData['mapped_format'] === 'mp4hd') ? 'mp4' : (($metaData['mapped_format'] === 'm4a') ? 'm4a' : 'mp3');
        $downloadFileName = $cleanTitle . '.' . $ext;
        $encodedFileName = rawurlencode($downloadFileName);

        $mimeType = 'application/octet-stream';
        if ($ext === 'mp4') {
            $mimeType = 'video/mp4';
        } elseif ($ext === 'mp3') {
            $mimeType = 'audio/mpeg';
        } elseif ($ext === 'm4a') {
            $mimeType = 'audio/mp4';
        }

        header('Content-Description: File Transfer');
        header('Content-Type: ' . $mimeType);
        header('Content-Disposition: attachment; filename="' . str_replace(['"', "'", ';'], '', $downloadFileName) . '"; filename*="UTF-8\'\'' . $encodedFileName . '"');
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $downloadUrl);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_TIMEOUT, 0);
        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');
        
        curl_setopt($ch, CURLOPT_HEADERFUNCTION, function($ch, $headerLine) {
            if (stripos($headerLine, 'content-length:') === 0) {
                header($headerLine);
            }
            return strlen($headerLine);
        });

        curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $chunk) {
            echo $chunk;
            flush();
            return strlen($chunk);
        });

        curl_exec($ch);
        exit;
    }
}

// Storage klasöründe dosyayı ara
$filePath = null;
foreach (['.mp4', '.mp3', '.m4a', '.webm'] as $ext) {
    $target = STORAGE_DIR . $token . $ext;
    if (file_exists($target) && filesize($target) > 0) {
        $filePath = $target;
        break;
    }
}

if (!$filePath) {
    http_response_code(404);
    die('Hata: Aradığınız dosya bulunamadı veya süresi dolmuş.');
}

$ext = pathinfo($filePath, PATHINFO_EXTENSION);
$fileSize = filesize($filePath);

// MIME türünü belirle
$mimeType = 'application/octet-stream';
if ($ext === 'mp4') {
    $mimeType = 'video/mp4';
} elseif ($ext === 'mp3') {
    $mimeType = 'audio/mpeg';
} elseif ($ext === 'm4a') {
    $mimeType = 'audio/mp4';
}

// Gerçek video başlığını al
$metaFile = STORAGE_DIR . $token . '.meta';
$rawTitle = '';
if (file_exists($metaFile)) {
    $metaData = json_decode(file_get_contents($metaFile), true);
    $rawTitle = trim($metaData['title'] ?? '');
}

if (!empty($rawTitle)) {
    // Güvenli dosya adı temizleme
    $cleanTitle = preg_replace('/[^\p{L}\p{N}\s\-\_\.\(\)]/u', '', $rawTitle);
    $cleanTitle = trim(preg_replace('/\s+/', ' ', $cleanTitle));
}

if (empty($cleanTitle)) {
    $cleanTitle = 'youtube_media_' . substr($token, 0, 8);
}

$downloadFileName = $cleanTitle . '.' . $ext;
$encodedFileName = rawurlencode($downloadFileName);

// İndirme Header'ları
header('Content-Description: File Transfer');
header('Content-Type: ' . $mimeType);
header('Content-Disposition: attachment; filename="' . str_replace(['"', "'", ';'], '', $downloadFileName) . '"; filename*="UTF-8\'\'' . $encodedFileName . '"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . $fileSize);


// Çıktı arabelleklerini tamamen temizle (Bellek taşmasını engeller)
if (ob_get_level()) {
    ob_end_clean();
}

$handle = fopen($filePath, 'rb');
if ($handle === false) {
    http_response_code(500);
    die('Hata: Dosya okunamadı.');
}

// Dosyayı 1'er MB'lık parçalar (chunk) halinde okuyup kullanıcıya aktar
while (!feof($handle)) {
    echo fread($handle, 1024 * 1024);
    flush();
}
fclose($handle);
exit;
