<?php
declare(strict_types=1);

/**
 * functional/audio/playlist_remove_track.php
 * Відповідає за:
 * - видалення треку з плейлиста
 * - safe redirect back
 * - перевірка власності плейлиста і треку
 * - (опційно) нормалізація position після видалення
 */

require_once __DIR__ . '/_boot.php';

$back = function_exists('post_str') ? post_str('back', '') : (string)($_POST['back'] ?? '');
if (!function_exists('safe_local_path')) {
    function safe_local_path(string $path, string $fallback = '/'): string
    {
        $path = trim(str_replace(["\0", "\r", "\n"], '', $path));
        if ($path === '') return $fallback;

        $p = parse_url($path);
        $pathOnly = (string)($p['path'] ?? '');
        $q = isset($p['query']) && $p['query'] !== '' ? ('?' . $p['query']) : '';
        $out = $pathOnly . $q;

        if ($out === '' || $out[0] !== '/') $out = '/' . ltrim($out, '/');
        if (str_contains($out, "\0")) return $fallback;

        return $out;
    }
}

$userId = (int)($me['id'] ?? 0);
$playlistId = post_int('playlist_id', 0);
$trackId = post_int('track_id', 0);

$defaultBack = ($playlistId > 0)
    ? ('/functional/audio/playlist_view.php?id=' . $playlistId)
    : '/functional/audio/';

$back = safe_local_path($back, $defaultBack);

if (!is_post()) {
    if (function_exists('redirect')) redirect($back);
    header('Location: ' . $back, true, 302);
    exit;
}

if (!csrf_check(post_str('csrf'))) {
    if (function_exists('flash_set')) flash_set('err', 'CSRF');
    if (function_exists('redirect')) redirect($back);
    header('Location: ' . $back, true, 302);
    exit;
}

if ($userId <= 0 || $playlistId <= 0 || $trackId <= 0) {
    if (function_exists('redirect')) redirect($back);
    header('Location: ' . $back, true, 303);
    exit;
}

/* ensure playlist belongs to user */
$st = $pdo->prepare("SELECT 1 FROM audio_playlists WHERE id=? AND user_id=? LIMIT 1");
$st->execute([$playlistId, $userId]);
if (!$st->fetchColumn()) {
    if (function_exists('redirect')) redirect($back);
    header('Location: ' . $back, true, 303);
    exit;
}

/* ensure track belongs to user */
$st = $pdo->prepare("SELECT 1 FROM audio_tracks WHERE id=? AND user_id=? LIMIT 1");
$st->execute([$trackId, $userId]);
if (!$st->fetchColumn()) {
    if (function_exists('redirect')) redirect($back);
    header('Location: ' . $back, true, 303);
    exit;
}

try {
    $pdo->beginTransaction();

    $st = $pdo->prepare("DELETE FROM audio_playlist_tracks WHERE playlist_id=? AND track_id=?");
    $st->execute([$playlistId, $trackId]);

    /**
     * Нормалізація position (щоб не було “дірок”).
     * Якщо ти не використовуєш position критично — можна прибрати цей блок.
     */
    $st = $pdo->prepare("
        SELECT track_id
        FROM audio_playlist_tracks
        WHERE playlist_id=?
        ORDER BY position ASC, added_at ASC
    ");
    $st->execute([$playlistId]);
    $rows = $st->fetchAll(PDO::FETCH_ASSOC) ?: [];

    if ($rows) {
        $upd = $pdo->prepare("UPDATE audio_playlist_tracks SET position=? WHERE playlist_id=? AND track_id=?");
        $pos = 1;
        foreach ($rows as $r) {
            $tid = (int)($r['track_id'] ?? 0);
            if ($tid <= 0) continue;
            $upd->execute([$pos, $playlistId, $tid]);
            $pos++;
        }
    }

    $pdo->commit();
    if (function_exists('flash_set')) flash_set('ok', 'OK');
} catch (Throwable $e) {
    if ($pdo->inTransaction()) $pdo->rollBack();
    if (function_exists('flash_set')) flash_set('err', 'DB error');
}

if (function_exists('redirect')) redirect($back);
header('Location: ' . $back, true, 303);
exit;