<?php
declare(strict_types=1);

/**
 * /functional/group/avatar.php
 * Завантаження аватарки групи (owner/admin).
 * - Доступ: тільки owner/admin
 * - POST + CSRF
 * - JPG/PNG/WEBP
 * - Видаляє попередній файл аватарки (якщо він у директорії цієї групи)
 * - SEO: noindex
 */

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: do not index ===== */
$title = g_t('Аватарка групи', 'Аватар группы', 'Group avatar');
$meta_robots = 'noindex, nofollow, noarchive, nosnippet';

$canonical = '';
if (function_exists('abs_url')) {
    $canonical = abs_url('/functional/group/avatar.php?id=' . (int)$g['id']);
} else {
    $canonical = '/functional/group/avatar.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);
}

/* ===== helpers ===== */
function g_group_avatar_dir_url(string $groupSlug): string
{
    // build url prefix that corresponds to g_group_upload_dir_abs($groupSlug,'avatar')
    $dirAbs = g_group_upload_dir_abs($groupSlug, 'avatar');

    $uploadAbs = realpath(g_upload_root_abs()) ?: g_upload_root_abs();
    $uploadAbs = g_norm_path($uploadAbs);

    $dirReal = realpath($dirAbs) ?: $dirAbs;
    $dirReal = g_norm_path($dirReal);

    if ($uploadAbs !== '' && str_starts_with($dirReal, $uploadAbs)) {
        $rel = substr($dirReal, strlen($uploadAbs));
        $rel = ltrim((string)$rel, '/');
        return '/upload/' . $rel;
    }

    // fallback
    return '/upload/group/' . (preg_replace('~[^a-zA-Z0-9_-]+~', '_', $groupSlug) ?: 'group') . '/avatar';
}

function g_upload_url_to_abs(string $urlPath): ?string
{
    $urlPath = trim($urlPath);
    if ($urlPath === '') return null;
    if (!str_starts_with($urlPath, '/upload/')) return null;

    $uploadAbs = realpath(g_upload_root_abs()) ?: g_upload_root_abs();
    $uploadAbs = g_norm_path($uploadAbs);

    $rel = substr($urlPath, strlen('/upload/'));
    $rel = ltrim($rel, '/');

    $abs = g_norm_path($uploadAbs . '/' . $rel);

    // safety: must stay inside upload root
    if ($uploadAbs !== '' && !str_starts_with($abs, $uploadAbs)) return null;

    return $abs;
}

/* ===== logic ===== */
$err = '';

if (($_SERVER['REQUEST_METHOD'] ?? '') === 'POST') {
    if (!g_csrf_check((string)($_POST['csrf'] ?? ''))) {
        $err = g_t('Помилка безпеки (CSRF).', 'Ошибка безопасности (CSRF).', 'Security error (CSRF).');
    } else {
        try {
            // стабільний slug для директорій
            $groupSlug = trim((string)($g['slug'] ?? ''));
            if ($groupSlug === '') {
                $groupSlug = 'group-' . (int)$g['id'];
            }

            $dir = g_group_upload_dir_abs($groupSlug, 'avatar');

            // upload (max 8MB)
            [$urlPath] = g_move_uploaded_image($_FILES['avatar'] ?? [], $dir, 8000000);

            // delete old avatar (only if belongs to this group's avatar dir)
            $old = trim((string)($g['avatar_path'] ?? ''));
            if ($old !== '' && $old !== $urlPath) {
                $dirUrl = rtrim(g_group_avatar_dir_url($groupSlug), '/');
                if (str_starts_with($old, $dirUrl . '/')) {
                    $oldAbs = g_upload_url_to_abs($old);
                    if ($oldAbs && is_file($oldAbs)) {
                        @unlink($oldAbs);
                    }
                }
            }

            // update DB (updated_at only if exists)
            $set = "avatar_path=?";
            $params = [$urlPath];

            if (g_column_exists($pdo, 'groups', 'updated_at')) {
                $set .= ", updated_at=?";
                $params[] = g_now();
            }

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

            $st = $pdo->prepare("UPDATE `groups` SET {$set} WHERE id=?");
            $st->execute($params);

            $g['avatar_path'] = $urlPath;

            if (function_exists('flash_set')) {
                flash_set('ok', g_t('Аватарку оновлено.', 'Аватар обновлён.', 'Avatar updated.'));
            }

            header('Location: ' . g_group_url($g));
            exit;

        } catch (Throwable $e) {
            // не світимо технічні деталі користувачу
            error_log('[group avatar upload] ' . $e->getMessage());
            $err = g_t(
                'Не вдалося завантажити аватарку. Перевір формат і розмір файлу.',
                'Не удалось загрузить аватар. Проверь формат и размер файла.',
                'Failed to upload avatar. Check file format and size.'
            );
        }
    }
}

/* ===== render ===== */
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 gap-3 align-items-center">
      <?php $cur = trim((string)($g['avatar_path'] ?? '')); ?>
      <div style="width:110px">
        <?php if ($cur !== ''): ?>
          <img src="<?= g_h($cur) ?>" alt="avatar" class="img-thumbnail" style="width:110px;height:110px;object-fit:cover">
        <?php else: ?>
          <div class="border rounded d-flex align-items-center justify-content-center text-muted" style="width:110px;height:110px">
            <?= g_h(g_t('Немає', 'Нет', 'None')) ?>
          </div>
        <?php endif; ?>
      </div>
      <div class="flex-grow-1">
        <div class="fw-semibold"><?= g_h(g_t('Поточна аватарка', 'Текущий аватар', 'Current avatar')) ?></div>
        <div class="text-muted small">
          <?= g_h(g_t(
              'Формат: JPG/PNG/WEBP. Максимум ~8MB. Краще квадратне зображення.',
              'Формат: JPG/PNG/WEBP. Максимум ~8MB. Лучше квадратное изображение.',
              'Format: JPG/PNG/WEBP. Max ~8MB. Prefer square image.'
          )) ?>
        </div>
      </div>
    </div>
  </div>

  <div class="card">
    <div class="card-body">
      <form method="post" enctype="multipart/form-data">
        <input type="hidden" name="csrf" value="<?= g_h(g_csrf_token()) ?>">

        <div class="mb-3">
          <label class="form-label"><?= g_h(g_t('Файл (JPG/PNG/WEBP)', 'Файл (JPG/PNG/WEBP)', 'File (JPG/PNG/WEBP)')) ?></label>
          <input class="form-control" type="file" name="avatar" accept="image/jpeg,image/png,image/webp" required>
        </div>

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

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