<?php
declare(strict_types=1);

/**
 * /functional/group/create.php
 * Створення групи:
 * - name, topic, about
 * - slug генерується автоматично (унікальний)
 * - owner стає учасником (role=owner)
 *
 * Оновлено:
 * - SEO noindex + no-store
 * - insert у groups / group_members підлаштовується під колонки (schema-flex)
 * - транзакція (group + membership)
 * - безпечніша генерація slug + обробка duplicate key
 */

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

/* ===== access ===== */
if (function_exists('require_login')) {
    require_login();
} else {
    $me0 = g_me();
    if (!$me0) { header('Location: /login.php'); exit; }
}

$pdo = g_db();
$me  = g_me();

if (!$me || (int)($me['id'] ?? 0) <= 0) {
    header('Location: /login.php');
    exit;
}

/* ===== SEO: do not index ===== */
$title = g_t('Створити групу', 'Создать группу', 'Create group');
$meta_robots = 'noindex, nofollow, noarchive, nosnippet';

$canonical = '';
if (function_exists('abs_url')) {
    $canonical = abs_url('/functional/group/create.php');
} else {
    $canonical = '/functional/group/create.php';
}

if (!headers_sent()) {
    header('X-Robots-Tag: noindex, nofollow, noarchive, nosnippet', true);
    header('Cache-Control: no-store, max-age=0', true);
}

/* ===== schema presence ===== */
$hasGroups = g_table_exists($pdo, 'groups') && g_table_exists($pdo, 'group_members');
if (!$hasGroups) {
    http_response_code(500);
    echo "DB schema missing: groups/group_members. Run migration.";
    exit;
}

/* ===== helpers ===== */
function g_mb_len(string $s): int
{
    if (function_exists('mb_strlen')) return (int)mb_strlen($s, 'UTF-8');
    return strlen($s);
}

function g_norm_spaces(string $s): string
{
    $s = trim($s);
    $s = preg_replace('~\s+~u', ' ', $s) ?? $s;
    return trim($s);
}

function g_make_unique_slug(PDO $pdo, string $base): string
{
    $base = trim($base);
    if ($base === '') $base = 'group';

    // швидка перевірка існування
    $st = $pdo->prepare("SELECT 1 FROM `groups` WHERE slug=? LIMIT 1");

    $slug = $base;
    for ($i = 0; $i < 25; $i++) {
        $st->execute([$slug]);
        if (!$st->fetchColumn()) return $slug;

        $suffix = bin2hex(random_bytes(2)); // 4 chars
        $slug = $base . '-' . $suffix;
    }

    // останній шанс — довший суфікс
    return $base . '-' . bin2hex(random_bytes(4));
}

function g_is_duplicate_key(Throwable $e): bool
{
    // MySQL duplicate key => SQLSTATE 23000
    $code = (string)$e->getCode();
    if ($code === '23000') return true;
    $msg = strtolower($e->getMessage());
    return str_contains($msg, 'duplicate') || str_contains($msg, 'unique');
}

function g_add_owner_membership(PDO $pdo, int $groupId, int $userId): void
{
    // якщо вже є — ок
    $st = $pdo->prepare("SELECT 1 FROM group_members WHERE group_id=? AND user_id=? LIMIT 1");
    $st->execute([$groupId, $userId]);
    if ($st->fetchColumn()) return;

    $cols = ['group_id', 'user_id'];
    $vals = [$groupId, $userId];

    if (g_column_exists($pdo, 'group_members', 'role')) {
        $cols[] = 'role';
        $vals[] = 'owner';
    }
    if (g_column_exists($pdo, 'group_members', 'status')) {
        $cols[] = 'status';
        $vals[] = 'active';
    }
    if (g_column_exists($pdo, 'group_members', 'created_at')) {
        $cols[] = 'created_at';
        $vals[] = g_now();
    }

    $ph = implode(',', array_fill(0, count($cols), '?'));
    $sql = "INSERT INTO group_members(" . implode(',', $cols) . ") VALUES($ph)";
    $ins = $pdo->prepare($sql);
    $ins->execute($vals);
}

/* ===== state ===== */
$err = '';
$name = '';
$topic = '';
$about = '';

/* ===== POST ===== */
if (($_SERVER['REQUEST_METHOD'] ?? '') === 'POST') {
    if (!g_csrf_check((string)($_POST['csrf'] ?? ''))) {
        $err = g_t('Помилка безпеки (CSRF).', 'Ошибка безопасности (CSRF).', 'Security error (CSRF).');
    } else {
        $name  = g_norm_spaces((string)($_POST['name'] ?? ''));
        $topic = g_norm_spaces((string)($_POST['topic'] ?? ''));
        $about = trim((string)($_POST['about'] ?? ''));

        // validation
        if ($name === '') {
            $err = g_t('Вкажи назву групи.', 'Укажи название группы.', 'Enter group name.');
        } elseif (g_mb_len($name) > 120) {
            $err = g_t('Назва занадто довга (макс 120).', 'Название слишком длинное (макс 120).', 'Name is too long (max 120).');
        } elseif ($topic !== '' && g_mb_len($topic) > 120) {
            $err = g_t('Тематика занадто довга (макс 120).', 'Тематика слишком длинная (макс 120).', 'Topic is too long (max 120).');
        } elseif ($about !== '' && g_mb_len($about) > 5000) {
            $err = g_t('Опис занадто довгий (макс 5000).', 'Описание слишком длинное (макс 5000).', 'About is too long (max 5000).');
        } else {
            $slugBase = g_slugify($name);
            if ($slugBase === '') $slugBase = 'group';

            // колонки groups
            $hasTopic     = g_column_exists($pdo, 'groups', 'topic');
            $hasAbout     = g_column_exists($pdo, 'groups', 'about');
            $hasCreatedAt = g_column_exists($pdo, 'groups', 'created_at');
            $hasUpdatedAt = g_column_exists($pdo, 'groups', 'updated_at');

            // базові колонки (мають бути)
            $requiredColsOk =
                g_column_exists($pdo, 'groups', 'owner_user_id') &&
                g_column_exists($pdo, 'groups', 'name') &&
                g_column_exists($pdo, 'groups', 'slug');

            if (!$requiredColsOk) {
                $err = g_t(
                    'У таблиці groups не вистачає обов’язкових колонок (owner_user_id/name/slug).',
                    'В таблице groups не хватает обязательных колонок (owner_user_id/name/slug).',
                    'Missing required columns in groups (owner_user_id/name/slug).'
                );
            } else {
                // спроби створення (на випадок гонки по slug)
                $created = false;
                $lastSlug = '';

                for ($attempt = 0; $attempt < 15; $attempt++) {
                    $slug = g_make_unique_slug($pdo, $slugBase);
                    $lastSlug = $slug;

                    // build INSERT під наявні колонки
                    $cols = ['owner_user_id', 'name', 'slug'];
                    $vals = [(int)$me['id'], $name, $slug];

                    if ($hasTopic) {
                        $cols[] = 'topic';
                        $vals[] = ($topic !== '' ? $topic : null);
                    }
                    if ($hasAbout) {
                        $cols[] = 'about';
                        $vals[] = ($about !== '' ? $about : null);
                    }
                    if ($hasCreatedAt) {
                        $cols[] = 'created_at';
                        $vals[] = g_now();
                    }
                    if ($hasUpdatedAt) {
                        $cols[] = 'updated_at';
                        $vals[] = g_now();
                    }

                    $ph = implode(',', array_fill(0, count($cols), '?'));
                    $sql = "INSERT INTO `groups`(" . implode(',', $cols) . ") VALUES($ph)";

                    try {
                        $pdo->beginTransaction();

                        $ins = $pdo->prepare($sql);
                        $ins->execute($vals);

                        $groupId = (int)$pdo->lastInsertId();

                        // owner membership (schema-flex)
                        g_add_owner_membership($pdo, $groupId, (int)$me['id']);

                        $pdo->commit();
                        $created = true;

                        if (function_exists('flash_set')) {
                            flash_set('ok', g_t('Групу створено.', 'Группа создана.', 'Group created.'));
                        }

                        header('Location: /functional/group/view.php?g=' . rawurlencode($slug));
                        exit;

                    } catch (Throwable $e) {
                        if ($pdo->inTransaction()) $pdo->rollBack();

                        // якщо slug дубль — пробуємо ще раз
                        if (g_is_duplicate_key($e)) {
                            continue;
                        }

                        // інша помилка
                        error_log('[group create] ' . $e->getMessage());
                        $err = g_t(
                            'Не вдалося створити групу. Спробуй ще раз.',
                            'Не удалось создать группу. Попробуй ещё раз.',
                            'Failed to create group. Please try again.'
                        );
                        break;
                    }
                }

                if (!$created && $err === '') {
                    error_log('[group create] slug attempts exhausted base=' . $slugBase . ' last=' . $lastSlug);
                    $err = g_t(
                        'Не вдалося підібрати унікальне посилання (slug). Спробуй іншу назву.',
                        'Не удалось подобрать уникальную ссылку (slug). Попробуй другое название.',
                        'Could not generate a unique slug. Try a different name.'
                    );
                }
            }
        }
    }
}

require __DIR__ . '/../../includes/header.php';
?>

<link rel="stylesheet" href="/css/group.css">

<div class="container my-4">
  <div class="d-flex align-items-center justify-content-between mb-3">
    <h1 class="h4 mb-0"><?= g_h($title) ?></h1>
    <a class="btn btn-sm btn-outline-secondary" href="/functional/group/index.php">
      <?= g_h(g_t('Назад', 'Назад', 'Back')) ?>
    </a>
  </div>

  <?php if ($err): ?>
    <div class="alert alert-danger"><?= g_h($err) ?></div>
  <?php endif; ?>

  <div class="card">
    <div class="card-body">
      <form method="post" action="/functional/group/create.php" autocomplete="off">
        <input type="hidden" name="csrf" value="<?= g_h(g_csrf_token()) ?>">

        <div class="mb-3">
          <label class="form-label"><?= g_h(g_t('Назва групи', 'Название группы', 'Group name')) ?></label>
          <input class="form-control" type="text" name="name" maxlength="120" required value="<?= g_h($name) ?>">
        </div>

        <div class="mb-3">
          <label class="form-label"><?= g_h(g_t('Тематика (категорія)', 'Тематика (категория)', 'Topic (category)')) ?></label>
          <input class="form-control" type="text" name="topic" maxlength="120" value="<?= g_h($topic) ?>" list="topicList">
          <datalist id="topicList">
            <option value="IT"></option>
            <option value="Games"></option>
            <option value="Music"></option>
            <option value="Cinema"></option>
            <option value="Sport"></option>
            <option value="Education"></option>
            <option value="News"></option>
          </datalist>
        </div>

        <div class="mb-3">
          <label class="form-label"><?= g_h(g_t('Опис', 'Описание', 'About')) ?></label>
          <textarea class="form-control" name="about" rows="4" maxlength="5000"><?= g_h($about) ?></textarea>
        </div>

        <button class="btn btn-primary" type="submit">
          <?= g_h(g_t('Створити', 'Создать', 'Create')) ?>
        </button>
      </form>
    </div>
  </div>
</div>

<?php require __DIR__ . '/../../includes/footer.php'; ?>