<?php
declare(strict_types=1);

/**
 * /functional/files/folder_create.php
 * Створює папку для поточного користувача.
 * parent_id: 0 = root, або id папки користувача
 *
 * Вимоги:
 * - тільки 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/');
}

$parentId = (int)($_POST['parent_id'] ?? 0);
if ($parentId < 0) $parentId = 0;

$name = (string)($_POST['name'] ?? '');
$name = preg_replace('~[\x00-\x1F\x7F]+~u', ' ', $name) ?? '';
$name = preg_replace('~[\r\n\t]+~u', ' ', $name) ?? '';
$name = trim($name);

$back = '/functional/files/' . ($parentId > 0 ? ('?folder=' . $parentId) : '');

if ($name === '') {
    mf_flash_set('err', 'Empty name');
    redirect($back);
}
if (mb_strlen($name, 'UTF-8') > 190) {
    mf_flash_set('err', 'Too long');
    redirect($back);
}

/* Додатково: заборона “службових” імен та розділювачів */
if (preg_match('~[\/\\\\]+~', $name)) {
    mf_flash_set('err', 'Invalid name');
    redirect($back);
}
if (preg_match('~^\.+$~u', $name)) {
    mf_flash_set('err', 'Invalid name');
    redirect($back);
}

/* verify parent belongs */
if ($parentId > 0) {
    $st = $pdo->prepare("SELECT id FROM myfile_folders WHERE id=? AND user_id=? LIMIT 1");
    $st->execute([$parentId, (int)$me['id']]);
    if (!$st->fetchColumn()) {
        mf_flash_set('err', 'Parent folder not found');
        redirect('/functional/files/');
    }
}

/* prevent duplicates in same parent (soft) */
if ($parentId > 0) {
    $st = $pdo->prepare("SELECT id FROM myfile_folders WHERE user_id=? AND parent_id=? AND name=? LIMIT 1");
    $st->execute([(int)$me['id'], $parentId, $name]);
} else {
    $st = $pdo->prepare("SELECT id FROM myfile_folders WHERE user_id=? AND parent_id IS NULL AND name=? LIMIT 1");
    $st->execute([(int)$me['id'], $name]);
}

if ($st->fetchColumn()) {
    mf_flash_set('err', 'Folder already exists');
    redirect($back);
}

/* INSERT (з fallback якщо немає created_at) */
try {
    $st = $pdo->prepare("INSERT INTO myfile_folders (user_id, parent_id, name, created_at) VALUES (?, ?, ?, NOW())");
    $st->execute([(int)$me['id'], ($parentId > 0 ? $parentId : null), $name]);
} catch (Throwable $e) {
    $st = $pdo->prepare("INSERT INTO myfile_folders (user_id, parent_id, name) VALUES (?, ?, ?)");
    $st->execute([(int)$me['id'], ($parentId > 0 ? $parentId : null), $name]);
}

mf_flash_set('ok', 'Folder created');
redirect($back);