<?php
declare(strict_types=1);

/**
 * /functional/group/edit.php
 * Налаштування групи:
 * - name, topic, about (якщо є колонки)
 * - is_closed: закрити/відкрити групу (якщо є колонка groups.is_closed)
 * - кнопки Аватарка/Обкладинка (посилання на avatar.php / cover.php)
 * - Посилання (до 5): URL + назва кнопки, відображаються під описом групи на view.php (через group_links)
 *
 * Доступ: owner або admin
 *
 * Оновлено:
 * - SEO noindex + no-store
 * - можна відкривати ?id= або ?g=slug
 * - schema-flex UPDATE під наявні колонки
 * - транзакція без “чужого commit”
 * - group_links: створення тільки для admin + перевірка колонок + без фаталів без mbstring
 * - безпечні помилки (лог замість показу технічних деталей)
 */

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();

/* ===== group resolve: by id or by slug ===== */
$id   = (int)($_GET['id'] ?? 0);
$slug = trim((string)($_GET['g'] ?? ''));

$g = null;
if ($id > 0) {
    $g = g_group_get($pdo, $id);
} elseif ($slug !== '') {
    $g = g_group_get_by_slug($pdo, $slug);
}

if (!$g) { http_response_code(404); echo "Group not found"; exit; }
if (!g_can_manage_group($me, $g)) { http_response_code(403); echo "Forbidden"; exit; }

/* ===== SEO ===== */
$title = g_t('Налаштування групи', 'Настройки группы', 'Group settings');
$meta_robots = 'noindex, nofollow, noarchive, nosnippet';

$canonical = '';
if (function_exists('abs_url')) {
    $canonical = abs_url('/functional/group/edit.php?id=' . (int)$g['id']);
} else {
    $canonical = '/functional/group/edit.php?id=' . (int)$g['id'];
}

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

/* ===== schema flags ===== */
$hasTopic     = g_column_exists($pdo, 'groups', 'topic');
$hasAbout     = g_column_exists($pdo, 'groups', 'about');
$hasUpdatedAt = g_column_exists($pdo, 'groups', 'updated_at');

$hasClosed = g_column_exists($pdo, 'groups', 'is_closed');
$isClosed  = $hasClosed ? ((int)($g['is_closed'] ?? 0) === 1) : false;

/* ===== state ===== */
$err = '';

$name  = (string)($g['name'] ?? '');
$topic = $hasTopic ? (string)($g['topic'] ?? '') : '';
$about = $hasAbout ? (string)($g['about'] ?? '') : '';

/* ===== helpers ===== */
function gl_mb_len(string $s): int
{
    if (function_exists('mb_strlen')) return (int)mb_strlen($s, 'UTF-8');
    return strlen($s);
}
function gl_mb_sub(string $s, int $start, int $len): string
{
    if (function_exists('mb_substr')) return (string)mb_substr($s, $start, $len, 'UTF-8');
    return substr($s, $start, $len);
}
function gl_norm_url(string $u): string
{
    $u = trim($u);
    if ($u === '') return '';
    if (strlen($u) > 2000) $u = substr($u, 0, 2000);

    if (!preg_match('~^https?://~i', $u)) return '';

    // додатково: базова валідація
    if (function_exists('filter_var')) {
        if (!filter_var($u, FILTER_VALIDATE_URL)) return '';
    }

    return $u;
}
function gl_norm_label(string $s): string
{
    $s = trim($s);
    if ($s === '') return '';
    if (gl_mb_len($s) > 40) $s = gl_mb_sub($s, 0, 40);
    return $s;
}

/* ===== group links availability ===== */
$linksEnabled = false;
$linksHint = '';
$links = array_fill(0, 5, ['url' => '', 'label' => '']);

$hasGroupLinksTable = g_table_exists($pdo, 'group_links');
if ($hasGroupLinksTable) {
    $hasGL_groupId = g_column_exists($pdo, 'group_links', 'group_id');
    $hasGL_url     = g_column_exists($pdo, 'group_links', 'url');
    $hasGL_label   = g_column_exists($pdo, 'group_links', 'label');
    $hasGL_sort    = g_column_exists($pdo, 'group_links', 'sort_order');

    $linksEnabled = $hasGL_groupId && $hasGL_url && $hasGL_label;

    if (!$linksEnabled) {
        $linksHint = g_t(
            'Таблиця group_links є, але не вистачає колонок. Посилання вимкнені.',
            'Таблица group_links есть, но не хватает колонок. Ссылки отключены.',
            'group_links exists, but required columns are missing. Links are disabled.'
        );
    } else {
        try {
            $order = $hasGL_sort ? "sort_order ASC, id ASC" : "id ASC";
            $stL = $pdo->prepare("SELECT url, label FROM group_links WHERE group_id=? ORDER BY {$order} LIMIT 5");
            $stL->execute([(int)$g['id']]);
            $rows = $stL->fetchAll(PDO::FETCH_ASSOC) ?: [];

            for ($i = 0; $i < 5; $i++) {
                if (!isset($rows[$i])) break;
                $links[$i]['url']   = trim((string)($rows[$i]['url'] ?? ''));
                $links[$i]['label'] = trim((string)($rows[$i]['label'] ?? ''));
            }
        } catch (Throwable $e) {
            $linksEnabled = false;
            $linksHint = g_t(
                'Не вдалося завантажити посилання. Посилання вимкнені.',
                'Не удалось загрузить ссылки. Ссылки отключены.',
                'Failed to load links. Links are disabled.'
            );
            error_log('[group edit] load links: ' . $e->getMessage());
        }
    }
} else {
    $linksHint = g_t(
        'Функція кнопок-посилань ще не увімкнена (немає таблиці group_links).',
        'Функция кнопок-ссылок ещё не включена (нет таблицы group_links).',
        'Links feature is not enabled yet (group_links table is missing).'
    );
}

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

        if ($hasClosed) {
            $isClosed = isset($_POST['is_closed']) && (string)($_POST['is_closed'] ?? '') === '1';
        }

        /* links from form */
        $urlsRaw   = $_POST['link_url'] ?? [];
        $labelsRaw = $_POST['link_label'] ?? [];

        $newLinks = [];
        if (is_array($urlsRaw) && is_array($labelsRaw)) {
            $max = min(5, max(count($urlsRaw), count($labelsRaw)));
            for ($i = 0; $i < $max; $i++) {
                $u = is_string($urlsRaw[$i] ?? null) ? (string)$urlsRaw[$i] : '';
                $l = is_string($labelsRaw[$i] ?? null) ? (string)$labelsRaw[$i] : '';

                $u = gl_norm_url($u);
                $l = gl_norm_label($l);

                if ($u === '' && $l === '') continue;

                if ($u === '') {
                    $err = g_t(
                        'Некоректне посилання. Використовуй http:// або https://',
                        'Некорректная ссылка. Используй http:// или https://',
                        'Bad link. Use http:// or https://'
                    );
                    break;
                }

                if ($l === '') $l = $u;

                $newLinks[] = ['url' => $u, 'label' => $l];
                if (count($newLinks) >= 5) break;
            }
        }

        if ($err === '' && $name === '') {
            $err = g_t('Вкажи назву групи.', 'Укажи название группы.', 'Enter group name.');
        }

        if ($err === '') {
            $startedTx = false;

            try {
                /* якщо group_links нема — створюємо ТІЛЬКИ для admin */
                if (!$hasGroupLinksTable && $newLinks) {
                    if (g_is_admin($me)) {
                        // DDL в MySQL може auto-commit; робимо до транзакції
                        $pdo->exec("
                            CREATE TABLE IF NOT EXISTS group_links (
                              id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
                              group_id INT UNSIGNED NOT NULL,
                              url VARCHAR(2048) NOT NULL,
                              label VARCHAR(80) NOT NULL DEFAULT '',
                              sort_order INT UNSIGNED NOT NULL DEFAULT 1,
                              created_at DATETIME NOT NULL,
                              updated_at DATETIME NOT NULL,
                              INDEX(group_id)
                            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
                        ");
                        $hasGroupLinksTable = g_table_exists($pdo, 'group_links');
                    } else {
                        // owner не може створювати схему
                        $linksHint = g_t(
                            'Щоб увімкнути кнопки-посилання, адміністратор має створити таблицю group_links.',
                            'Чтобы включить кнопки-ссылки, администратор должен создать таблицу group_links.',
                            'To enable links, an admin must create the group_links table.'
                        );
                    }
                }

                if (!$pdo->inTransaction()) {
                    $pdo->beginTransaction();
                    $startedTx = true;
                }

                /* UPDATE groups: тільки по існуючих колонках */
                $sets = [];
                $params = [];

                // name — очікуємо що існує
                $sets[] = "name=?";
                $params[] = $name;

                if ($hasTopic) {
                    $sets[] = "topic=?";
                    $params[] = ($topic !== '' ? $topic : null);
                }
                if ($hasAbout) {
                    $sets[] = "about=?";
                    $params[] = ($about !== '' ? $about : null);
                }
                if ($hasClosed) {
                    $sets[] = "is_closed=?";
                    $params[] = ($isClosed ? 1 : 0);
                }
                if ($hasUpdatedAt) {
                    $sets[] = "updated_at=?";
                    $params[] = g_now();
                }

                $params[] = (int)$g['id'];

                $sql = "UPDATE `groups` SET " . implode(',', $sets) . " WHERE id=?";
                $st = $pdo->prepare($sql);
                $st->execute($params);

                /* links: replace (якщо доступно і таблиця валідна) */
                $linksEnabledNow = false;
                if ($hasGroupLinksTable) {
                    $hasGL_groupId = g_column_exists($pdo, 'group_links', 'group_id');
                    $hasGL_url     = g_column_exists($pdo, 'group_links', 'url');
                    $hasGL_label   = g_column_exists($pdo, 'group_links', 'label');
                    $hasGL_sort    = g_column_exists($pdo, 'group_links', 'sort_order');
                    $hasGL_ca      = g_column_exists($pdo, 'group_links', 'created_at');
                    $hasGL_ua      = g_column_exists($pdo, 'group_links', 'updated_at');

                    $linksEnabledNow = $hasGL_groupId && $hasGL_url && $hasGL_label;

                    if ($linksEnabledNow) {
                        $stD = $pdo->prepare("DELETE FROM group_links WHERE group_id=?");
                        $stD->execute([(int)$g['id']]);

                        if ($newLinks) {
                            $cols = ['group_id', 'url', 'label'];
                            if ($hasGL_sort) $cols[] = 'sort_order';
                            if ($hasGL_ca)   $cols[] = 'created_at';
                            if ($hasGL_ua)   $cols[] = 'updated_at';

                            $ph = implode(',', array_fill(0, count($cols), '?'));
                            $sqlI = "INSERT INTO group_links (" . implode(',', $cols) . ") VALUES ($ph)";
                            $stI = $pdo->prepare($sqlI);

                            $sort = 1;
                            $now = g_now();
                            foreach ($newLinks as $lnk) {
                                $vals = [(int)$g['id'], (string)$lnk['url'], (string)$lnk['label']];
                                if ($hasGL_sort) $vals[] = $sort;
                                if ($hasGL_ca)   $vals[] = $now;
                                if ($hasGL_ua)   $vals[] = $now;

                                $stI->execute($vals);
                                $sort++;
                                if ($sort > 5) break;
                            }
                        }
                    }
                }

                if ($startedTx) {
                    $pdo->commit();
                }

                if (function_exists('flash_set')) {
                    flash_set('ok', g_t('Збережено.', 'Сохранено.', 'Saved.'));
                }

                // refresh group and redirect
                $g = g_group_get($pdo, (int)$g['id']) ?: $g;
                header('Location: ' . g_group_url($g));
                exit;

            } catch (Throwable $e) {
                if ($startedTx && $pdo->inTransaction()) {
                    $pdo->rollBack();
                }
                error_log('[group edit] ' . $e->getMessage());

                $err = g_t(
                    'Не вдалося зберегти налаштування. Спробуй ще раз.',
                    'Не удалось сохранить настройки. Попробуй ещё раз.',
                    'Failed to save settings. Please try again.'
                );
            }
        }

        /* repopulate links UI if validation failed */
        $links = array_fill(0, 5, ['url' => '', 'label' => '']);
        for ($i = 0; $i < 5; $i++) {
            $u = is_array($urlsRaw ?? null) && is_string($urlsRaw[$i] ?? null) ? trim((string)$urlsRaw[$i]) : '';
            $l = is_array($labelsRaw ?? null) && is_string($labelsRaw[$i] ?? null) ? trim((string)$labelsRaw[$i]) : '';
            $links[$i]['url'] = $u;
            $links[$i]['label'] = $l;
        }
    }
}

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="<?= g_h(g_group_url($g)) ?>"><?= g_h(g_t('Назад', 'Назад', 'Back')) ?></a>
  </div>

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

  <div class="card mb-3">
    <div class="card-body d-flex flex-wrap gap-2 align-items-center justify-content-between">
      <div class="fw-semibold"><?= g_h(g_t('Швидкі дії', 'Быстрые действия', 'Quick actions')) ?></div>
      <div class="d-flex flex-wrap gap-2">
        <a class="btn btn-sm btn-outline-secondary" href="/functional/group/avatar.php?id=<?= (int)$g['id'] ?>">
          <?= g_h(g_t('Аватарка', 'Аватар', 'Avatar')) ?>
        </a>
        <a class="btn btn-sm btn-outline-secondary" href="/functional/group/cover.php?id=<?= (int)$g['id'] ?>">
          <?= g_h(g_t('Обкладинка', 'Обложка', 'Cover')) ?>
        </a>
      </div>
    </div>
  </div>

  <div class="card">
    <div class="card-body">
      <form method="post" 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('Назва', 'Название', 'Name')) ?></label>
          <input class="form-control" type="text" name="name" maxlength="120" required value="<?= g_h($name) ?>">
        </div>

        <?php if ($hasTopic): ?>
          <div class="mb-3">
            <label class="form-label"><?= g_h(g_t('Тематика', 'Тематика', 'Topic')) ?></label>
            <input class="form-control" type="text" name="topic" maxlength="120" value="<?= g_h($topic) ?>">
          </div>
        <?php endif; ?>

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

        <?php if ($hasClosed): ?>
          <div class="mb-3">
            <div class="form-check">
              <input class="form-check-input" type="checkbox" id="is_closed" name="is_closed" value="1" <?= $isClosed ? 'checked' : '' ?>>
              <label class="form-check-label" for="is_closed">
                <?= g_h(g_t('Закрити групу (заборонити вступ новим учасникам)', 'Закрыть группу (запретить вступ новым участникам)', 'Close group (block new members from joining)')) ?>
              </label>
            </div>
            <div class="form-text">
              <?= g_h(g_t(
                'Якщо увімкнено — нові користувачі не зможуть вступати в групу.',
                'Если включено — новые пользователи не смогут вступать в группу.',
                'If enabled — new users cannot join the group.'
              )) ?>
            </div>
          </div>
        <?php endif; ?>

        <hr class="my-4">

        <div class="mb-2 fw-semibold d-flex align-items-center justify-content-between flex-wrap gap-2">
          <span><?= g_h(g_t('Посилання (кнопки)', 'Ссылки (кнопки)', 'Links (buttons)')) ?></span>
          <span class="text-muted small">
            <?= g_h($linksEnabled ? g_t('Доступні', 'Доступны', 'Enabled') : g_t('Вимкнені', 'Отключены', 'Disabled')) ?>
          </span>
        </div>

        <?php if (!$linksEnabled && $linksHint): ?>
          <div class="alert alert-secondary py-2"><?= g_h($linksHint) ?></div>
        <?php else: ?>
          <div class="text-muted small mb-3">
            <?= g_h(g_t(
              'До 5 кнопок. Ліворуч — посилання (http/https), праворуч — назва кнопки.',
              'До 5 кнопок. Слева — ссылка (http/https), справа — название кнопки.',
              'Up to 5 buttons. Left — URL (http/https), right — button label.'
            )) ?>
          </div>

          <?php for ($i=0; $i<5; $i++): ?>
            <div class="row g-2 align-items-center mb-2">
              <div class="col-12 col-md-7">
                <input class="form-control" type="url" name="link_url[]"
                       placeholder="https://example.com"
                       value="<?= g_h((string)($links[$i]['url'] ?? '')) ?>">
              </div>
              <div class="col-12 col-md-5">
                <input class="form-control" type="text" name="link_label[]"
                       maxlength="40"
                       placeholder="<?= g_h(g_t('Назва кнопки', 'Название кнопки', 'Button label')) ?>"
                       value="<?= g_h((string)($links[$i]['label'] ?? '')) ?>">
              </div>
            </div>
          <?php endfor; ?>
        <?php endif; ?>

        <button class="btn btn-primary mt-3" type="submit"><?= g_h(g_t('Зберегти', 'Сохранить', 'Save')) ?></button>
      </form>
    </div>
  </div>
</div>

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