<?php
declare(strict_types=1);

/**
 * /functional/post/create.php
 *
 * Відповідає за:
 * - створення ОСОБИСТОГО поста (стрічка / профіль)
 * - перевірку методу і CSRF
 * - захист від помилкового group_id у цьому endpoint
 * - виклик спільного ядра /functional/post/_lib.php
 * - flash-повідомлення і redirect назад
 * - непомітну антиспам-перевірку нового акаунта
 *
 * SEO:
 * - endpoint службовий
 * - noindex, nofollow, noarchive
 */

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

require_login();

/* endpoint не індексуємо */
if (!headers_sent()) {
    header('X-Robots-Tag: noindex, nofollow, noarchive, nosnippet', true);
    header('Cache-Control: no-store, max-age=0', true);
}

/* fallback */
if (!isset($pdo) || !($pdo instanceof PDO)) $pdo = db();
if (!isset($me) || !is_array($me)) $me = current_user();

/* back */
$back = vm_post_safe_back((string)post_str('back', ''), '/');
if ($back === '/' || $back === '') {
    $ref = (string)($_SERVER['HTTP_REFERER'] ?? '');
    $back = vm_post_safe_back($ref, '/');
}
if ($back === '') $back = '/';

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

/* csrf */
if (!csrf_check(post_str('csrf'))) {
    flash_set('err', t('bad_csrf'));
    redirect($back);
}

$vmPostRestrictionState = function_exists('ar_get_state') ? ar_get_state($pdo, (int)($me['id'] ?? 0)) : [];
if (is_array($vmPostRestrictionState) && function_exists('ar_is_action_blocked') && ar_is_action_blocked($vmPostRestrictionState, 'posts')) {
    flash_set('err', function_exists('ar_action_error')
        ? ar_action_error($vmPostRestrictionState, 'posts')
        : vm_post_t('Вам заборонено публікувати пости.', 'Вам запрещено публиковать посты.', 'You are not allowed to create posts.'));
    redirect($back);
}

/* якщо помилково відправили group_id — відправляємо в груповий endpoint/UI */
$wrongGroupId = (int)($_POST['group_id'] ?? 0);
if ($wrongGroupId > 0) {
    try {
        $st = $pdo->prepare("SELECT id, slug FROM `groups` WHERE id=? LIMIT 1");
        $st->execute([$wrongGroupId]);
        $g = $st->fetch(PDO::FETCH_ASSOC) ?: null;

        flash_set(
            'err',
            vm_post_t(
                'Пост у групі треба створювати через форму групи.',
                'Пост в группе нужно создавать через форму группы.',
                'A group post must be created from the group form.'
            )
        );

        if ($g) {
            $slug = trim((string)($g['slug'] ?? ''));
            if ($slug !== '') {
                redirect('/functional/group/view.php?g=' . rawurlencode($slug));
            }
            redirect('/functional/group/view.php?id=' . (int)$g['id']);
        }

        redirect('/functional/group/index.php');
    } catch (Throwable $e) {
        flash_set(
            'err',
            vm_post_t(
                'Пост у групі треба створювати через форму групи.',
                'Пост в группе нужно создавать через форму группы.',
                'A group post must be created from the group form.'
            )
        );
        redirect('/functional/group/index.php');
    }
}

/* дані */
$body         = (string)post_str('body', '');
$pollQuestion = (string)post_str('poll_question', '');
$pollOptions  = $_POST['poll_options'] ?? [];
if (!is_array($pollOptions)) $pollOptions = [];

/* файли: підтримуємо всі можливі імена поля */
$postFiles = [];
foreach (['attachments', 'files', 'post_files'] as $field) {
    if (isset($_FILES[$field])) {
        $postFiles = $_FILES[$field];
        break;
    }
}

$projectRoot = realpath(dirname(__DIR__, 2)) ?: dirname(__DIR__, 2);

/* створення */
$res = vm_post_create_core([
    'pdo'           => $pdo,
    'me'            => $me,
    'project_root'  => $projectRoot,
    'body'          => $body,
    'group_id'      => 0,
    'files'         => $postFiles,
    'poll_question' => $pollQuestion,
    'poll_options'  => $pollOptions,
]);

if (!$res['ok']) {
    $msg = trim((string)($res['error'] ?? ''));
    if ($msg === '') {
        $msg = vm_post_t(
            'Не вдалося створити пост.',
            'Не удалось создать пост.',
            'Failed to create post.'
        );
    }

    flash_set('err', $msg);
    redirect($back);
}

/* частина файлів могла не пройти — покажемо першу помилку, але пост уже створено */
$uploadError = trim((string)($res['upload_error'] ?? ''));
if ($uploadError !== '') {
    flash_set('err', $uploadError);
}

/* антиспам: тільки позначає, не блокує */
try {
    $userId = (int)($me['id'] ?? 0);
    $flag = antispam_evaluate_content($pdo, $userId, 'post', $body);
    if ($flag) {
        antispam_flag_user(
            $pdo,
            $userId,
            (string)($flag['status'] ?? 'bot'),
            (string)($flag['reason_code'] ?? 'post_rule'),
            (string)($flag['reason_text'] ?? 'Антиспам: підозрілий пост'),
            is_array($flag['details'] ?? null) ? $flag['details'] : [],
            null,
            false
        );
    }
} catch (Throwable $e) {
    error_log('post/create.php antispam error: ' . $e->getMessage());
}

flash_set('ok', t('publish') . ' OK');
redirect($back);
