<?php
declare(strict_types=1);

/**
 * /functional/group/members.php
 * Список учасників групи:
 * - показ усіх учасників
 * - ролі: owner / admin / moderator / member
 * - owner/admin можуть змінювати роль
 * - owner/admin можуть активувати pending або видаляти учасника
 *
 * Доступ:
 * - перегляд: active member / moderator / admin / owner / site admin
 * - керування: owner / group admin / site admin
 */

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

require_login();

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

if (!$me) {
    redirect('/login.php');
}

$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_table_exists($pdo, 'group_members')) {
    http_response_code(500);
    echo "DB schema missing: group_members";
    exit;
}

if (!g_can_view_members($me, $g)) {
    http_response_code(403);
    echo "Forbidden";
    exit;
}

$title = g_t('Учасники групи', 'Участники группы', 'Group members') . ' — ' . (string)($g['name'] ?? '');
$seo_noindex = true;
$canonical = function_exists('abs_url')
    ? abs_url('/functional/group/members.php?id=' . (int)$g['id'])
    : '/functional/group/members.php?id=' . (int)$g['id'];

$gmHasRole        = g_column_exists($pdo, 'group_members', 'role');
$gmHasStatus      = g_column_exists($pdo, 'group_members', 'status');
$gmHasCreatedAt   = g_column_exists($pdo, 'group_members', 'created_at');
$gmHasPendingKind = g_column_exists($pdo, 'group_members', 'pending_kind');

$canManage = g_can_manage_members($me, $g);
$meId = (int)($me['id'] ?? 0);
$ownerId = (int)($g['owner_user_id'] ?? 0);

$err = '';
$ok  = '';

if (($_SERVER['REQUEST_METHOD'] ?? '') === 'POST') {
    if (!$canManage) {
        $err = g_t('У вас немає прав керувати учасниками.', 'У вас нет прав управлять участниками.', 'You are not allowed to manage members.');
    } elseif (!g_csrf_check((string)($_POST['csrf'] ?? ''))) {
        $err = g_t('Помилка безпеки (CSRF).', 'Ошибка безопасности (CSRF).', 'Security error (CSRF).');
    } else {
        $action = trim((string)($_POST['action'] ?? ''));
        $userId = (int)($_POST['user_id'] ?? 0);

        if ($userId <= 0) {
            $err = g_t('Некоректний користувач.', 'Некорректный пользователь.', 'Invalid user.');
        } else {
            try {
                $mem = g_membership($pdo, (int)$g['id'], $userId);
                if (!$mem) {
                    $err = g_t('Учасника не знайдено.', 'Участник не найден.', 'Member not found.');
                } else {
                    $curRole = trim((string)($mem['role'] ?? 'member'));
                    $curStatus = trim((string)($mem['status'] ?? 'active'));

                    if ($action === 'set_role') {
                        $newRole = trim((string)($_POST['role'] ?? 'member'));
                        if (!in_array($newRole, ['admin', 'moderator', 'member'], true)) {
                            $err = g_t('Некоректна роль.', 'Некорректная роль.', 'Invalid role.');
                        } elseif (!$gmHasRole) {
                            $err = g_t('Колонка role відсутня у group_members.', 'Колонка role отсутствует в group_members.', 'group_members.role column is missing.');
                        } elseif ($userId === $ownerId || $curRole === 'owner') {
                            $err = g_t('Роль власника змінювати не можна.', 'Роль владельца менять нельзя.', 'Owner role cannot be changed.');
                        } else {
                            $st = $pdo->prepare("UPDATE group_members SET role=? WHERE group_id=? AND user_id=? LIMIT 1");
                            $st->execute([$newRole, (int)$g['id'], $userId]);
                            $ok = g_t('Роль оновлено.', 'Роль обновлена.', 'Role updated.');
                        }
                    } elseif ($action === 'activate') {
                        if (!$gmHasStatus) {
                            $err = g_t('Колонка status відсутня у group_members.', 'Колонка status отсутствует в group_members.', 'group_members.status column is missing.');
                        } else {
                            $sql = "UPDATE group_members SET status='active'";
                            if ($gmHasPendingKind) {
                                $sql .= ", pending_kind=NULL";
                            }
                            $sql .= " WHERE group_id=? AND user_id=? LIMIT 1";

                            $st = $pdo->prepare($sql);
                            $st->execute([(int)$g['id'], $userId]);

                            $ok = g_t('Учасника активовано.', 'Участник активирован.', 'Member activated.');
                        }
                    } elseif ($action === 'remove') {
                        if ($userId === $ownerId || $curRole === 'owner') {
                            $err = g_t('Власника не можна видалити.', 'Владельца нельзя удалить.', 'Owner cannot be removed.');
                        } else {
                            $st = $pdo->prepare("DELETE FROM group_members WHERE group_id=? AND user_id=? LIMIT 1");
                            $st->execute([(int)$g['id'], $userId]);
                            $ok = g_t('Учасника видалено з групи.', 'Участник удалён из группы.', 'Member removed from group.');
                        }
                    }
                }
            } catch (Throwable $e) {
                error_log('[group members] ' . $e->getMessage());
                $err = g_t('Помилка сервера.', 'Ошибка сервера.', 'Server error.');
            }
        }
    }
}

$orderParts = [];
if ($gmHasStatus) {
    $orderParts[] = "CASE gm.status WHEN 'active' THEN 0 WHEN 'pending' THEN 1 WHEN 'banned' THEN 2 ELSE 3 END";
}
if ($gmHasPendingKind) {
    $orderParts[] = "CASE gm.pending_kind WHEN 'request' THEN 0 WHEN 'invite' THEN 1 ELSE 2 END";
}
if ($gmHasRole) {
    $orderParts[] = "CASE gm.role WHEN 'owner' THEN 0 WHEN 'admin' THEN 1 WHEN 'moderator' THEN 2 ELSE 3 END";
}
$orderParts[] = "u.username ASC";
$orderSql = implode(', ', $orderParts);

$selectCols = [
    "gm.group_id",
    "gm.user_id",
    "u.username",
    "u.first_name",
    "u.last_name",
    "u.full_name",
    "u.avatar_path",
];
if ($gmHasRole) $selectCols[] = "gm.role";
if ($gmHasStatus) $selectCols[] = "gm.status";
if ($gmHasCreatedAt) $selectCols[] = "gm.created_at";
if ($gmHasPendingKind) $selectCols[] = "gm.pending_kind";

$st = $pdo->prepare("
    SELECT " . implode(', ', $selectCols) . "
    FROM group_members gm
    JOIN users u ON u.id = gm.user_id
    WHERE gm.group_id = ?
    ORDER BY {$orderSql}
");
$st->execute([(int)$g['id']]);
$members = $st->fetchAll(PDO::FETCH_ASSOC) ?: [];

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

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

<div class="container my-4">
  <div class="d-flex align-items-center justify-content-between gap-2 flex-wrap mb-3">
    <div>
      <h1 class="h4 mb-1"><?= g_h($title) ?></h1>
      <div class="text-muted small">
        <?= g_h(g_t('Група', 'Группа', 'Group')) ?>:
        <a class="text-decoration-none" href="<?= g_h(g_group_url($g)) ?>"><?= g_h((string)($g['name'] ?? '')) ?></a>
      </div>
    </div>

    <div class="d-flex gap-2 flex-wrap">
      <a class="btn btn-sm btn-outline-secondary" href="<?= g_h(g_group_url($g)) ?>">
        <?= g_h(g_t('Назад до групи', 'Назад к группе', 'Back to group')) ?>
      </a>
      <?php if ($canManage): ?>
        <a class="btn btn-sm btn-outline-success" href="/users.php?invite_group=<?= (int)$g['id'] ?>&back=<?= urlencode('/functional/group/members.php?id=' . (int)$g['id']) ?>">
          <?= g_h(g_t('Запросити людей', 'Пригласить людей', 'Invite people')) ?>
        </a>
      <?php endif; ?>
    </div>
  </div>

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

  <?php if ($ok !== ''): ?>
    <div class="alert alert-success"><?= g_h($ok) ?></div>
  <?php endif; ?>

  <div class="card">
    <div class="card-body p-0">
      <?php if (!$members): ?>
        <div class="p-3 text-muted"><?= g_h(g_t('У групі ще немає учасників.', 'В группе ещё нет участников.', 'No members in this group yet.')) ?></div>
      <?php else: ?>
        <div class="list-group list-group-flush">
          <?php foreach ($members as $m): ?>
            <?php
              $uid = (int)($m['user_id'] ?? 0);
              $username = (string)($m['username'] ?? '');
              $full = trim((string)($m['full_name'] ?? ''));
              if ($full === '') {
                $full = trim((string)($m['first_name'] ?? '') . ' ' . (string)($m['last_name'] ?? ''));
              }
              if ($full === '') $full = $username !== '' ? $username : ('#' . $uid);

              $avatar = trim((string)($m['avatar_path'] ?? ''));
              $role = $gmHasRole ? trim((string)($m['role'] ?? 'member')) : 'member';
              $status = $gmHasStatus ? trim((string)($m['status'] ?? 'active')) : 'active';
              $created = $gmHasCreatedAt ? trim((string)($m['created_at'] ?? '')) : '';
              $pendingKind = $gmHasPendingKind ? trim((string)($m['pending_kind'] ?? '')) : '';

              $roleLabel = match ($role) {
                'owner' => g_t('Власник', 'Владелец', 'Owner'),
                'admin' => g_t('Адмін', 'Админ', 'Admin'),
                'moderator' => g_t('Модератор', 'Модератор', 'Moderator'),
                default => g_t('Учасник', 'Участник', 'Member'),
              };

              if ($status === 'pending' && $pendingKind === 'request') {
                $statusLabel = g_t('Заявка на вступ', 'Заявка на вступление', 'Join request');
              } elseif ($status === 'pending') {
                $statusLabel = g_t('Запрошено', 'Приглашён', 'Invited');
              } elseif ($status === 'banned') {
                $statusLabel = g_t('Заблокований', 'Заблокирован', 'Banned');
              } else {
                $statusLabel = g_t('Активний', 'Активный', 'Active');
              }

              $canEditThis = $canManage && $uid > 0 && $uid !== $ownerId && $role !== 'owner';
              $profileUrl = $username !== '' ? '/profile/?u=' . urlencode($username) : '/profile/index.php?id=' . $uid;

              $activateLabel = ($status === 'pending' && $pendingKind === 'request')
                ? g_t('Підтвердити заявку', 'Подтвердить заявку', 'Approve request')
                : g_t('Підтвердити', 'Подтвердить', 'Activate');
            ?>
            <div class="list-group-item">
              <div class="d-flex align-items-start justify-content-between gap-3 flex-wrap">
                <div class="d-flex gap-3 align-items-start">
                  <div style="width:56px;height:56px;border-radius:16px;overflow:hidden;background:#e9ecef;flex:0 0 auto;">
                    <?php if ($avatar !== ''): ?>
                      <img src="<?= g_h($avatar) ?>" alt="" style="width:100%;height:100%;object-fit:cover;display:block;">
                    <?php else: ?>
                      <div style="width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-weight:700;color:#6c757d;">
                        <?= g_h(function_exists('mb_substr') ? mb_strtoupper(mb_substr($full, 0, 1, 'UTF-8'), 'UTF-8') : strtoupper(substr($full, 0, 1))) ?>
                      </div>
                    <?php endif; ?>
                  </div>

                  <div>
                    <div class="fw-semibold">
                      <a class="text-decoration-none" href="<?= g_h($profileUrl) ?>"><?= g_h($full) ?></a>
                    </div>
                    <div class="text-muted small">@<?= g_h($username) ?></div>

                    <div class="mt-2 d-flex gap-2 flex-wrap">
                      <span class="badge bg-dark"><?= g_h($roleLabel) ?></span>

                      <?php if ($status === 'active'): ?>
                        <span class="badge bg-success"><?= g_h($statusLabel) ?></span>
                      <?php elseif ($status === 'pending'): ?>
                        <span class="badge bg-warning text-dark"><?= g_h($statusLabel) ?></span>
                      <?php else: ?>
                        <span class="badge bg-secondary"><?= g_h($statusLabel) ?></span>
                      <?php endif; ?>

                      <?php if ($created !== ''): ?>
                        <span class="badge bg-light text-dark border"><?= g_h($created) ?></span>
                      <?php endif; ?>
                    </div>
                  </div>
                </div>

                <?php if ($canEditThis): ?>
                  <div class="d-flex gap-2 flex-wrap">
                    <?php if ($gmHasRole): ?>
                      <form method="post" class="d-flex gap-2 flex-wrap m-0">
                        <input type="hidden" name="csrf" value="<?= g_h(g_csrf_token()) ?>">
                        <input type="hidden" name="action" value="set_role">
                        <input type="hidden" name="user_id" value="<?= $uid ?>">

                        <select name="role" class="form-select form-select-sm" style="width:auto;">
                          <option value="member" <?= $role === 'member' ? 'selected' : '' ?>><?= g_h(g_t('Учасник', 'Участник', 'Member')) ?></option>
                          <option value="moderator" <?= $role === 'moderator' ? 'selected' : '' ?>><?= g_h(g_t('Модератор', 'Модератор', 'Moderator')) ?></option>
                          <option value="admin" <?= $role === 'admin' ? 'selected' : '' ?>><?= g_h(g_t('Адмін', 'Админ', 'Admin')) ?></option>
                        </select>

                        <button type="submit" class="btn btn-sm btn-outline-primary"><?= g_h(g_t('Змінити роль', 'Сменить роль', 'Change role')) ?></button>
                      </form>
                    <?php endif; ?>

                    <?php if ($gmHasStatus && $status === 'pending'): ?>
                      <form method="post" class="m-0">
                        <input type="hidden" name="csrf" value="<?= g_h(g_csrf_token()) ?>">
                        <input type="hidden" name="action" value="activate">
                        <input type="hidden" name="user_id" value="<?= $uid ?>">
                        <button type="submit" class="btn btn-sm btn-outline-success"><?= g_h($activateLabel) ?></button>
                      </form>
                    <?php endif; ?>

                    <form method="post" class="m-0" onsubmit="return confirm(<?= json_encode(g_t('Видалити учасника з групи?', 'Удалить участника из группы?', 'Remove member from group?'), JSON_UNESCAPED_UNICODE) ?>);">
                      <input type="hidden" name="csrf" value="<?= g_h(g_csrf_token()) ?>">
                      <input type="hidden" name="action" value="remove">
                      <input type="hidden" name="user_id" value="<?= $uid ?>">
                      <button type="submit" class="btn btn-sm btn-outline-danger"><?= g_h(g_t('Видалити', 'Удалить', 'Remove')) ?></button>
                    </form>
                  </div>
                <?php endif; ?>
              </div>
            </div>
          <?php endforeach; ?>
        </div>
      <?php endif; ?>
    </div>
  </div>
</div>

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