<?php
declare(strict_types=1);

/**
 * /functional/files/folder_delete.php
 * Видаляє папку (тільки якщо вона порожня):
 * - нема підпапок
 * - нема файлів у цій папці
 *
 * Вимоги:
 * - тільки POST
 * - CSRF
 * - тільки власник
 *
 * SEO: службовий endpoint => noindex
 */

/*
  ВАЖЛИВО:
  /functional/files/* => до кореня сайту треба піднятися на 2 рівні:
  files -> functional -> ROOT
*/
require_once dirname(__DIR__, 2) . '/includes/start.php';

/** @var PDO|null $pdo */
/** @var array|null $me */
$pdo = (isset($pdo) && $pdo instanceof PDO) ? $pdo : db();
$me  = $me ?? current_user();

/* SEO / robots */
if (!headers_sent()) {
    header('X-Robots-Tag: noindex, nofollow, noarchive, nosnippet', true);
    header('X-Content-Type-Options: nosniff', true);
    header('Referrer-Policy: same-origin', true);
    header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0', true);
    header('Pragma: no-cache', true);
    header('Expires: 0', true);
}

if (!function_exists('redirect')) {
    function redirect(string $to): void {
        header('Location: ' . $to, true, 303);
        exit;
    }
}
if (!function_exists('is_post')) {
    function is_post(): bool {
        return (string)($_SERVER['REQUEST_METHOD'] ?? '') === 'POST';
    }
}
if (!function_exists('csrf_check')) {
    function csrf_check(?string $t): bool {
        return !empty($t) && !empty($_SESSION['csrf']) && hash_equals((string)$_SESSION['csrf'], (string)$t);
    }
}

/* flash compatible with includes/header.php */
if (!function_exists('mf_flash_set')) {
    function mf_flash_set(string $k, string $v): void {
        if (!isset($_SESSION)) return;
        if (!isset($_SESSION['_flash']) || !is_array($_SESSION['_flash'])) $_SESSION['_flash'] = [];
        $_SESSION['_flash'][$k] = $v;
    }
}

/* login required */
if (!$me || (int)($me['id'] ?? 0) <= 0) {
    redirect('/login.php');
}

/* не POST — назад */
if (!is_post()) {
    redirect('/functional/files/');
}

/* CSRF */
if (!csrf_check((string)($_POST['csrf'] ?? ''))) {
    mf_flash_set('err', 'CSRF error');
    redirect('/functional/files/');
}

$folderId = (int)($_POST['folder_id'] ?? 0);
if ($folderId <= 0) {
    mf_flash_set('err', 'Bad folder');
    redirect('/functional/files/');
}

/* folder belongs? (потрібні тільки поля parent_id) */
$st = $pdo->prepare("SELECT id, parent_id FROM myfile_folders WHERE id=? AND user_id=? LIMIT 1");
$st->execute([$folderId, (int)$me['id']]);
$folder = $st->fetch(PDO::FETCH_ASSOC);

if (!$folder) {
    mf_flash_set('err', 'Folder not found');
    redirect('/functional/files/');
}

$parentId = (int)($folder['parent_id'] ?? 0);
$backToCurrent = '/functional/files/?folder=' . $folderId;

/* has children? */
$st = $pdo->prepare("SELECT 1 FROM myfile_folders WHERE user_id=? AND parent_id=? LIMIT 1");
$st->execute([(int)$me['id'], $folderId]);
if ($st->fetchColumn()) {
    mf_flash_set('err', 'Folder not empty (subfolders)');
    redirect($backToCurrent);
}

/* has files? */
$st = $pdo->prepare("SELECT 1 FROM myfiles WHERE user_id=? AND folder_id=? LIMIT 1");
$st->execute([(int)$me['id'], $folderId]);
if ($st->fetchColumn()) {
    mf_flash_set('err', 'Folder not empty (files)');
    redirect($backToCurrent);
}

/* delete db row */
$st = $pdo->prepare("DELETE FROM myfile_folders WHERE id=? AND user_id=? LIMIT 1");
$st->execute([$folderId, (int)$me['id']]);

/* try remove physical dir (if empty) — тільки в межах /upload */
$root = realpath(dirname(__DIR__, 2));
if ($root === false) $root = dirname(__DIR__, 2);

$uploadsRoot = realpath($root . '/upload');

if ($uploadsRoot !== false) {
    $uploadsRootNorm = rtrim($uploadsRoot, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;

    $username = (string)($me['username'] ?? 'user');
    // мінімальна нормалізація username для файлового шляху
    $username = preg_replace('~[^a-z0-9_\-\.]~i', '_', $username) ?? 'user';
    $username = trim($username, '._-');
    if ($username === '') $username = 'user';

    $dir = $root . '/upload/' . $username . '/myfiles/fld_' . $folderId;

    // realpath поверне false якщо папки нема — тоді просто пропускаємо
    $dirReal = realpath($dir);
    if ($dirReal !== false) {
        $dirRealNorm = rtrim($dirReal, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;

        // захист від виходу за межі /upload
        if (strpos($dirRealNorm, $uploadsRootNorm) === 0 && is_dir($dirReal)) {
            // rmdir пройде лише якщо порожня
            @rmdir($dirReal);
        }
    }
}

mf_flash_set('ok', 'Folder deleted');
redirect('/functional/files/' . ($parentId > 0 ? ('?folder=' . $parentId) : ''));