<?php
declare(strict_types=1);

/**
 * /post_repost.php
 * - Створює репост: додає новий запис у posts з repost_post_id
 * - Якщо передали репост-ід, перетворює на оригінал
 * - ✅ back тепер підтримує #fragment (щоб не кидало вгору сторінки)
 */

require_once __DIR__ . '/includes/start.php';

require_login();

function vm_safe_back(string $raw, string $default = '/'): string
{
    $raw = trim((string)$raw);
    if ($raw === '') return $default;

    // абсолютний -> path+query+fragment
    if (preg_match('~^https?://~i', $raw)) {
        $p = parse_url($raw);
        $path = (string)($p['path'] ?? '/');
        $q = isset($p['query']) && $p['query'] !== '' ? ('?' . $p['query']) : '';
        $h = isset($p['fragment']) && $p['fragment'] !== '' ? ('#' . $p['fragment']) : '';
        $raw = $path . $q . $h;
    }

    // збережемо fragment окремо
    $frag = '';
    if (strpos($raw, '#') !== false) {
        [$base, $fr] = explode('#', $raw, 2);
        $raw = (string)$base;
        $fr = (string)$fr;

        // sanitize fragment (щоб не було сміття)
        $fr = preg_replace('~[^A-Za-z0-9\-_:.]~', '', $fr) ?? '';
        if ($fr !== '') $frag = '#' . $fr;
    }

    // перевірка внутрішнього шляху
    $base = safe_local_path($raw, $default);

    return $base . $frag;
}

if (!is_post()) {
    http_response_code(405);
    echo "Method Not Allowed";
    exit;
}

$back = vm_safe_back(post_str('back', ''), '/');

if (!csrf_check(post_str('csrf'))) {
    flash_set('err', 'CSRF');
    redirect($back);
}

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

if (!db_has_column($pdo, 'posts', 'repost_post_id')) {
    flash_set('err', 'DB update required: add posts.repost_post_id');
    redirect($back);
}

$postId = (int)post_str('post_id', '0');
if ($postId <= 0) {
    flash_set('err', 'Bad post id');
    redirect($back);
}

/* resolve to original if user clicked "repost" on a repost */
$st = $pdo->prepare("SELECT id, repost_post_id FROM posts WHERE id=? LIMIT 1");
$st->execute([$postId]);
$row = $st->fetch(PDO::FETCH_ASSOC);
if (!$row) {
    flash_set('err', 'Post not found');
    redirect($back);
}

$origId = (int)($row['repost_post_id'] ?? 0);
if ($origId <= 0) $origId = (int)$row['id'];

/* prevent duplicates (optional) */
$st = $pdo->prepare("SELECT id FROM posts WHERE user_id=? AND repost_post_id=? LIMIT 1");
$st->execute([$meId, $origId]);
$exists = (int)($st->fetchColumn() ?: 0);
if ($exists > 0) {
    flash_set('ok', 'Already reposted');
    redirect($back);
}

/* create repost */
$st = $pdo->prepare("INSERT INTO posts (user_id, repost_post_id, body, created_at) VALUES (?, ?, ?, NOW())");
$st->execute([$meId, $origId, '']);

flash_set('ok', 'Reposted');
redirect($back);