<?php
declare(strict_types=1);

/**
 * /functional/board/manage.php
 * Дії з оголошеннями автора
 */

require_once dirname(__DIR__, 2) . '/includes/start.php';
require_once __DIR__ . '/_lib.php';

$pdo = brd_db();
$me  = brd_require_login();

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    brd_redirect('/functional/board/my.php');
}

if (!brd_csrf_check($_POST['csrf'] ?? null)) {
    brd_flash_set('board_my', 'danger', brd_t('Помилка безпеки. Оновіть сторінку.', 'Ошибка безопасности. Обновите страницу.', 'Security error. Refresh the page.'));
    brd_redirect('/functional/board/my.php');
}

$adId = (int)($_POST['id'] ?? 0);
$do   = (string)($_POST['do'] ?? '');
$ad   = brd_load_ad($pdo, $adId);

if (!$ad || !brd_owner_can_edit($ad, $me)) {
    brd_flash_set('board_my', 'danger', brd_t('Оголошення не знайдено.', 'Объявление не найдено.', 'Ad not found.'));
    brd_redirect('/functional/board/my.php');
}

$settings = brd_load_settings($pdo);

try {
    $pdo->beginTransaction();

    if ($do === 'submit') {
        $status = (string)($ad['status'] ?? '');
        if (!in_array($status, ['draft', 'rejected', 'archived'], true)) {
            throw new RuntimeException(brd_t('Цю дію зараз виконати не можна.', 'Это действие сейчас недоступно.', 'This action is not available now.'));
        }

        $alreadyPaid = ((string)($ad['payment_status'] ?? 'unpaid') === 'paid');
        $publishPrice = $alreadyPaid ? (int)($ad['publish_price'] ?? 0) : max(0, (int)($settings['board_publish_price'] ?? 25));

        if (!$alreadyPaid && $publishPrice > 0) {
            $charge = brd_charge_user_coins(
                $pdo,
                (int)$me['id'],
                $publishPrice,
                'board_ad',
                (int)$ad['id'],
                'board_publish',
                'Board ad publish payment',
                ['board_ad_id' => (int)$ad['id'], 'price' => $publishPrice]
            );
            if (empty($charge['ok'])) {
                throw new RuntimeException((string)($charge['message'] ?? 'VM Coins error.'));
            }
        }

        $st = $pdo->prepare("
            UPDATE board_ads
            SET status = 'pending',
                payment_status = 'paid',
                publish_price = ?,
                paid_at = COALESCE(paid_at, NOW()),
                moderation_note = NULL,
                approved_at = NULL,
                approved_by_user_id = NULL,
                rejected_at = NULL,
                rejected_by_user_id = NULL,
                updated_at = NOW()
            WHERE id = ?
        ");
        $st->execute([$publishPrice, $adId]);

        brd_log_moderation($pdo, $adId, null, 'submitted', 'Submitted by user');
        $msg = brd_t('Оголошення надіслано на модерацію.', 'Объявление отправлено на модерацию.', 'The ad was submitted for moderation.');
    } elseif ($do === 'archive') {
        $st = $pdo->prepare("UPDATE board_ads SET status = 'archived', updated_at = NOW() WHERE id = ?");
        $st->execute([$adId]);
        brd_log_moderation($pdo, $adId, null, 'archived', 'Archived by user');
        $msg = brd_t('Оголошення перенесено в архів.', 'Объявление перенесено в архив.', 'The ad was archived.');
    } elseif ($do === 'restore_draft') {
        $st = $pdo->prepare("UPDATE board_ads SET status = 'draft', updated_at = NOW() WHERE id = ?");
        $st->execute([$adId]);
        brd_log_moderation($pdo, $adId, null, 'restored', 'Restored to draft by user');
        $msg = brd_t('Оголошення повернено в чернетку.', 'Объявление возвращено в черновик.', 'The ad was restored to draft.');
    } elseif ($do === 'delete') {
        $st = $pdo->prepare("UPDATE board_ads SET status = 'deleted', updated_at = NOW() WHERE id = ?");
        $st->execute([$adId]);
        brd_log_moderation($pdo, $adId, null, 'deleted', 'Deleted by user');
        $msg = brd_t('Оголошення видалено.', 'Объявление удалено.', 'The ad was deleted.');
    } else {
        throw new RuntimeException('Unknown action.');
    }

    $pdo->commit();
    brd_flash_set('board_my', 'success', $msg);
} catch (Throwable $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    brd_flash_set('board_my', 'danger', $e->getMessage());
}

brd_redirect('/functional/board/my.php');
