<?php
session_start();
require_once 'includes/functions.php';

$batch = $_GET['batch'] ?? '';
$id = $_GET['id'] ?? '';
$isPreview = isset($_GET['preview']);
$format = $_GET['format'] ?? '';

// Paylaşım kodu ile erişim
$shareCode = $_GET['code'] ?? '';
$validAccess = false;

if (isset($_SESSION['user_id'])) {
    $validAccess = true;
} elseif ($shareCode) {
    $share = getShareByCode($shareCode);
    if ($share && $share['file_id'] === $id) {
        $validAccess = true;
    }
}

if (!$validAccess) {
    http_response_code(403);
    die('Erişim reddedildi. Lütfen giriş yapın.');
}

// ── Toplu ZIP indirme ──
if ($batch === 'zip' && isset($_GET['ids'])) {
    if (!class_exists('ZipArchive')) {
        http_response_code(500);
        die('Sunucuda ZIP desteği bulunmuyor.');
    }
    $ids = explode(',', $_GET['ids']);
    if (empty($ids)) {
        http_response_code(400);
        die('Dosya seçilmedi.');
    }

    $zip = new ZipArchive();
    $tmpFile = tempnam(sys_get_temp_dir(), 'batch_') . '.zip';
    if ($zip->open($tmpFile, ZipArchive::CREATE) !== true) {
        http_response_code(500);
        die('ZIP oluşturulamadı.');
    }

    $added = 0;
    foreach ($ids as $fid) {
        $fid = trim($fid);
        $file = getFileById($fid);
        if (!$file || isExpired($file)) continue;
        $diskPath = UPLOADS_DIR . $file['stored_name'];
        if (file_exists($diskPath)) {
            $zip->addFile($diskPath, $file['original_name']);
            $added++;
        }
    }
    $zip->close();

    if ($added === 0) {
        @unlink($tmpFile);
        http_response_code(404);
        die('İndirilecek dosya bulunamadı.');
    }

    $who = isset($_SESSION['username']) ? $_SESSION['username'] : 'Paylaşım';
    addSystemLog('download', $who . ' toplu indirme yaptı (' . $added . ' dosya)', $_SESSION['user_id'] ?? null);

    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename="DataStore_' . date('Y-m-d') . '.zip"');
    header('Content-Length: ' . filesize($tmpFile));
    readfile($tmpFile);
    @unlink($tmpFile);
    exit;
}

$file = getFileById($id);

if (!$file) {
    http_response_code(404);
    die('Dosya bulunamadı veya süresi doldu.');
}

if (isExpired($file)) {
    http_response_code(410);
    die('Bu dosyanın süresi dolmuştur.');
}

$diskPath = UPLOADS_DIR . $file['stored_name'];

if (!file_exists($diskPath)) {
    http_response_code(404);
    die('Dosya disk üzerinde bulunamadı.');
}

// ── Kod dosyası: orijinal halini zip'ten çıkarıp indir ──
if (!empty($file['code_zipped']) && $format === 'original') {
    if (!class_exists('ZipArchive')) {
        http_response_code(500);
        die('Sunucuda ZIP desteği bulunmuyor.');
    }
    $zip = new ZipArchive();
    if ($zip->open($diskPath) !== true) {
        http_response_code(500);
        die('ZIP dosyası açılamadı.');
    }
    $tmpDir = sys_get_temp_dir() . '/ds_' . bin2hex(random_bytes(4));
    @mkdir($tmpDir, 0700, true);
    $extracted = $zip->extractTo($tmpDir, basename($file['original_name']));
    if ($extracted) {
        $origPath = $tmpDir . '/' . $file['original_name'];
        if (file_exists($origPath)) {
            $mime = 'application/octet-stream';
            $who = isset($_SESSION['username']) ? $_SESSION['username'] : 'Paylaşım';
            addSystemLog('download', $who . ' kod dosyası indirdi (orijinal): ' . $file['original_name'], $_SESSION['user_id'] ?? null);
            header('Content-Type: ' . $mime);
            header('Content-Disposition: attachment; filename="' . rawurlencode($file['original_name']) . '"');
            header('Content-Length: ' . filesize($origPath));
            readfile($origPath);
            @unlink($origPath);
            @rmdir($tmpDir);
            $zip->close();
            exit;
        }
    }
    $zip->close();
    @rmdir($tmpDir);
    http_response_code(500);
    die('Dosya zip içinden çıkarılamadı.');
}

// ── Kod dosyası: zip olarak indir (default) ──
if (!empty($file['code_zipped']) && $format !== 'original') {
    $who = isset($_SESSION['username']) ? $_SESSION['username'] : 'Paylaşım';
    addSystemLog('download', $who . ' kod dosyası indirdi (zip): ' . $file['original_name'], $_SESSION['user_id'] ?? null);
    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename="' . rawurlencode(pathinfo($file['original_name'], PATHINFO_FILENAME) . '.zip') . '"');
    header('Content-Length: ' . filesize($diskPath));
    header('X-Content-Type-Options: nosniff');
    readfile($diskPath);
    exit;
}

$mime = $file['mime'] ?: 'application/octet-stream';

header('Content-Type: ' . $mime);
header('Content-Length: ' . filesize($diskPath));
header('X-Content-Type-Options: nosniff');

if ($isPreview) {
    header('Content-Disposition: inline; filename="' . rawurlencode($file['original_name']) . '"');
} else {
    header('Content-Disposition: attachment; filename="' . rawurlencode($file['original_name']) . '"');
}

$who = isset($_SESSION['username']) ? $_SESSION['username'] : 'Paylaşım';
$act = $isPreview ? 'önizledi' : 'indirdi';
addSystemLog('download', $who . ' dosya ' . $act . ': ' . $file['original_name'], $_SESSION['user_id'] ?? null);

readfile($diskPath);
exit;
