<?php
declare(strict_types=1);

/**
 * /blocks/profile.php
 * Лівий блок навігації:
 * - міні-аватар + ПІБ + @нік (клікабельні -> /profile/)
 * - компактний блок VM Coins:
 *   - баланс
 *   - красива кнопка переходу на /profile/coins.php
 * - меню:
 *   Стрічка, Налаштування, Мої аудіо, Мої відеозаписи, Мої файли,
 *   Мої друзі(+N заявок), Повідомлення(+N нових), Адмінка(якщо адмін), Вийти
 * - для гостей: Стрічка, Увійти, Реєстрація
 *
 * Оновлено:
 * - прибрано пункт "Редагувати профіль"
 * - пункт "Налаштування" перенесено після "Повідомлення", перед "Адмінка"
 * - баланс VM Coins завжди перечитується з БД
 * - ПОВНІСТЮ ПРИБРАНО фоновий polling/fetch/setInterval,
 *   бо він ламав лайки/дизлайки на сторінках
 * - live-оновлення sidebar-балансу тепер тільки через явну подію:
 *   window.dispatchEvent(new CustomEvent('vmcoins:refresh'))
 */

if (!function_exists('h')) {
  function h(?string $s): string { return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); }
}

$vmCoinsLib = __DIR__ . '/../functional/VMCoins/_lib.php';
if (is_file($vmCoinsLib)) {
  require_once $vmCoinsLib;
}

$meLocal = null;
if (isset($me) && is_array($me)) {
  $meLocal = $me;
} elseif (function_exists('current_user')) {
  $meLocal = current_user();
}

$pdoLocal = null;
if (isset($pdo) && $pdo instanceof PDO) {
  $pdoLocal = $pdo;
} elseif (function_exists('db')) {
  try {
    $pdoLocal = db();
  } catch (Throwable $e) {
    $pdoLocal = null;
  }
}

if (!function_exists('vm_block_db_has_column')) {
  function vm_block_db_has_column(PDO $pdo, string $table, string $column): bool
  {
    try {
      $st = $pdo->prepare("
        SELECT 1
        FROM information_schema.columns
        WHERE table_schema = DATABASE()
          AND table_name = ?
          AND column_name = ?
        LIMIT 1
      ");
      $st->execute([$table, $column]);
      return (bool)$st->fetchColumn();
    } catch (Throwable $e) {
      return false;
    }
  }
}

/* ===== Lang (uk/ru/en) ===== */
$lang = (string)($_SESSION['lang'] ?? '');
if ($lang === '' && is_array($meLocal)) {
  $lang = (string)($meLocal['lang'] ?? '');
}
if (!in_array($lang, ['uk','ru','en'], true)) {
  $lang = 'uk';
}

$T = function(string $uk, string $ru, string $en) use ($lang): string {
  if ($lang === 'ru') return $ru;
  if ($lang === 'en') return $en;
  return $uk;
};

$hasVmBalanceCol = false;
$vmCoinsBalance = 0;
$vmCoinsEnabled = false;

/* ===== Refresh user from DB ===== */
if ($pdoLocal instanceof PDO && is_array($meLocal) && (int)($meLocal['id'] ?? 0) > 0) {
  try {
    $hasVmBalanceCol = vm_block_db_has_column($pdoLocal, 'users', 'vm_coins_balance');

    $select = ['id', 'username', 'lang', 'role'];
    if (vm_block_db_has_column($pdoLocal, 'users', 'first_name')) $select[] = 'first_name';
    if (vm_block_db_has_column($pdoLocal, 'users', 'last_name')) $select[] = 'last_name';
    if (vm_block_db_has_column($pdoLocal, 'users', 'full_name')) $select[] = 'full_name';
    if (vm_block_db_has_column($pdoLocal, 'users', 'avatar_path')) $select[] = 'avatar_path';
    if ($hasVmBalanceCol) $select[] = 'vm_coins_balance';

    $st = $pdoLocal->prepare("SELECT " . implode(',', array_unique($select)) . " FROM users WHERE id=? LIMIT 1");
    $st->execute([(int)$meLocal['id']]);
    $fresh = $st->fetch(PDO::FETCH_ASSOC) ?: null;

    if ($fresh) {
      $meLocal = array_merge($meLocal, $fresh);
    }
  } catch (Throwable $e) {
    // ignore
  }
}

if (function_exists('vmc_enabled') && $pdoLocal instanceof PDO) {
  try {
    $vmCoinsEnabled = vmc_enabled($pdoLocal);
  } catch (Throwable $e) {
    $vmCoinsEnabled = false;
  }
}

/* ===== Balance: always prefer fresh DB helper ===== */
if (is_array($meLocal) && (int)($meLocal['id'] ?? 0) > 0) {
  $userIdForCoins = (int)$meLocal['id'];

  if ($pdoLocal instanceof PDO && function_exists('vmc_get_balance')) {
    try {
      $vmCoinsBalance = vmc_get_balance($pdoLocal, $userIdForCoins);
    } catch (Throwable $e) {
      $vmCoinsBalance = 0;
    }
  } elseif ($hasVmBalanceCol) {
    $vmCoinsBalance = (int)($meLocal['vm_coins_balance'] ?? 0);
  }
}

/* ===== Active link ===== */
$path = (string)parse_url((string)($_SERVER['REQUEST_URI'] ?? '/'), PHP_URL_PATH);
if ($path === '') $path = '/';

if (!function_exists('is_active')) {
  function is_active(string $href, string $path): bool {
    if ($href === '/') return $path === '/';
    if ($href === '/profile/coins.php') return $path === '/profile/coins.php';
    if ($href === '/profile/setting/index.php') return str_starts_with($path, '/profile/setting');
    if ($href === '/messages/' || $href === '/messages') return str_starts_with($path, '/messages');
    if ($href === '/functional/audio') return str_starts_with($path, '/functional/audio');
    if ($href === '/functional/video') return str_starts_with($path, '/functional/video');
    if ($href === '/functional/files') return str_starts_with($path, '/functional/files');
    if ($href === '/functional/friends' || $href === '/functional/friends/') return str_starts_with($path, '/functional/friends');
    if ($href === '/admin/' || $href === '/admin') return str_starts_with($path, '/admin');
    return $path === $href;
  }
}

if (!function_exists('vm_table_exists')) {
  function vm_table_exists(PDO $pdo, string $table): bool {
    try {
      $st = $pdo->prepare("
        SELECT 1
        FROM information_schema.tables
        WHERE table_schema = DATABASE()
          AND table_name = ?
        LIMIT 1
      ");
      $st->execute([$table]);
      return (bool)$st->fetchColumn();
    } catch (Throwable $e) {
      return false;
    }
  }
}

$username = is_array($meLocal) ? (string)($meLocal['username'] ?? '') : '';
$role     = is_array($meLocal) ? (string)($meLocal['role'] ?? 'user') : 'user';

$fullName = '';
if (is_array($meLocal)) {
  $fullName = trim((string)($meLocal['full_name'] ?? ''));
  if ($fullName === '') {
    $fn = trim((string)($meLocal['first_name'] ?? ''));
    $ln = trim((string)($meLocal['last_name'] ?? ''));
    $fullName = trim($fn . ' ' . $ln);
  }
}
if ($fullName === '') {
  $fullName = $username !== '' ? $username : $T('Гість', 'Гость', 'Guest');
}

$avatar = is_array($meLocal) ? trim((string)($meLocal['avatar_path'] ?? '')) : '';

$isAuth = is_array($meLocal) && (int)($meLocal['id'] ?? 0) > 0;

/* ✅ профіль ведемо на конкретного юзера */
$profileLink = ($username !== '') ? ('/profile/?u=' . rawurlencode($username)) : '/profile/';

/* ===== Friends pending badge ===== */
$pendingIncoming = 0;
if ($isAuth && $pdoLocal instanceof PDO) {
  if (vm_table_exists($pdoLocal, 'friend_requests')) {
    try {
      $st = $pdoLocal->prepare("SELECT COUNT(*) FROM friend_requests WHERE to_user_id=? AND status='pending'");
      $st->execute([(int)$meLocal['id']]);
      $pendingIncoming = (int)$st->fetchColumn();
    } catch (Throwable $e) {
      $pendingIncoming = 0;
    }
  }
}
$friendsBadge = '';
if ($pendingIncoming > 0) {
  $val = $pendingIncoming > 99 ? '99+' : ('+' . (int)$pendingIncoming);
  $friendsBadge = '<span style="display:inline-block;margin-left:8px;padding:2px 7px;border-radius:999px;font-size:12px;line-height:16px;background:#ff3b30;color:#fff;font-weight:700;">' . $val . '</span>';
}

/* ===== Messages unread badge ===== */
$unreadMessages = 0;
$messagesBadge = '';

if ($isAuth && $pdoLocal instanceof PDO) {
  if (vm_table_exists($pdoLocal, 'message_threads') && vm_table_exists($pdoLocal, 'message_messages')) {
    try {
      $meId = (int)$meLocal['id'];

      $sql = "
        SELECT COUNT(*)
        FROM message_messages m
        JOIN message_threads t ON t.id = m.thread_id
        WHERE m.sender_id <> ?
          AND (
            (t.user1_id = ? AND (t.user1_last_read_at IS NULL OR m.created_at > t.user1_last_read_at))
            OR
            (t.user2_id = ? AND (t.user2_last_read_at IS NULL OR m.created_at > t.user2_last_read_at))
          )
      ";
      $st = $pdoLocal->prepare($sql);
      $st->execute([$meId, $meId, $meId]);
      $unreadMessages = (int)$st->fetchColumn();
    } catch (Throwable $e) {
      $unreadMessages = 0;
    }
  }
}

if ($unreadMessages > 0) {
  $val = $unreadMessages > 99 ? '99+' : ('+' . (int)$unreadMessages);
  $messagesBadge = '<span style="display:inline-block;margin-left:8px;padding:2px 7px;border-radius:999px;font-size:12px;line-height:16px;background:#22c55e;color:#fff;font-weight:800;">' . $val . '</span>';
}

/* ===== admin roles ===== */
$isAdmin = in_array($role, ['admin','root','owner'], true);
?>
<div class="vm-side-card">

  <?php if ($isAuth): ?>
    <a class="vm-side-top vm-side-top-link" href="<?= h($profileLink) ?>" style="text-decoration:none; color:inherit;">
      <div class="vm-side-avatar">
        <?php if ($avatar !== ''): ?>
          <img src="<?= h($avatar) ?>" alt="">
        <?php else: ?>
          <div class="vm-side-avatar-ph"></div>
        <?php endif; ?>
      </div>

      <div class="vm-side-user">
        <div class="vm-side-name"><?= h($fullName) ?></div>
        <?php if ($username !== ''): ?>
          <div class="vm-side-username">@<?= h($username) ?></div>
        <?php endif; ?>
      </div>
    </a>
  <?php else: ?>
    <div class="vm-side-top">
      <div class="vm-side-avatar">
        <div class="vm-side-avatar-ph"></div>
      </div>
      <div class="vm-side-user">
        <div class="vm-side-name"><?= h($fullName) ?></div>
      </div>
    </div>
  <?php endif; ?>

  <?php if ($isAuth && ($vmCoinsEnabled || $hasVmBalanceCol || function_exists('vmc_get_balance'))): ?>
    <div style="margin:12px 0 10px;padding:14px;border:1px solid rgba(37,99,235,.12);border-radius:16px;background:linear-gradient(180deg,rgba(255,255,255,.96),rgba(239,246,255,.92));box-shadow:0 10px 28px rgba(37,99,235,.08);">
      <div class="d-flex align-items-start justify-content-between gap-2 mb-2">
        <div>
          <div style="font-size:18px;font-weight:800;line-height:1.1;">VM Coins</div>
          <div style="margin-top:2px;font-size:12px;color:#6b7280;"><?= h($T('Внутрішній баланс акаунта','Внутренний баланс аккаунта','Internal account balance')) ?></div>
        </div>

        <a
          href="/profile/coins.php"
          style="display:inline-flex;align-items:center;justify-content:center;padding:8px 13px;border-radius:999px;background:linear-gradient(135deg,#2563eb,#1d4ed8);color:#fff;text-decoration:none;font-size:12px;font-weight:800;letter-spacing:.2px;white-space:nowrap;box-shadow:0 10px 24px rgba(37,99,235,.22);"
        >
          <?= h($T('Керувати','Управлять','Manage')) ?>
        </a>
      </div>

      <div data-vmc-balance style="font-size:34px;font-weight:900;line-height:1;color:#111827;"><?= h((string)$vmCoinsBalance) ?></div>
      <div style="margin-top:8px;font-size:12px;color:#6b7280;"><?= h($T('Перегляд історії, промокоду та керування бонусами','Просмотр истории, промокода и управление бонусами','View history, promo code, and bonus controls')) ?></div>
    </div>
  <?php endif; ?>

  <nav class="vm-side-menu">
    <a class="<?= is_active('/', $path) ? 'active' : '' ?>" href="/">
      <span class="vm-ico">🏠</span> <span><?= h($T('Стрічка','Лента','Feed')) ?></span>
    </a>

    <?php if ($isAuth): ?>
      <a class="<?= is_active('/functional/audio', $path) ? 'active' : '' ?>" href="/functional/audio">
        <span class="vm-ico">🎧</span> <span><?= h($T('Мої аудіо','Мои аудио','My audio')) ?></span>
      </a>

      <a class="<?= is_active('/functional/video', $path) ? 'active' : '' ?>" href="/functional/video">
        <span class="vm-ico">🎬</span> <span><?= h($T('Мої відеозаписи','Мои видео','My videos')) ?></span>
      </a>

      <a class="<?= is_active('/functional/files', $path) ? 'active' : '' ?>" href="/functional/files">
        <span class="vm-ico">📁</span> <span><?= h($T('Мої файли','Мои файлы','My files')) ?></span>
      </a>

      <a class="<?= is_active('/functional/friends/', $path) ? 'active' : '' ?>" href="/functional/friends/">
        <span class="vm-ico">👥</span>
        <span><?= h($T('Мої друзі','Мои друзья','My friends')) ?></span>
        <?= $friendsBadge ?>
      </a>

      <a class="<?= is_active('/messages/', $path) ? 'active' : '' ?>" href="/messages/">
        <span class="vm-ico">💬</span> <span><?= h($T('Повідомлення','Сообщения','Messages')) ?></span>
        <?= $messagesBadge ?>
      </a>

      <a class="<?= is_active('/profile/setting/index.php', $path) ? 'active' : '' ?>" href="/profile/setting/index.php">
        <span class="vm-ico">⚙️</span> <span><?= h($T('Налаштування','Настройки','Settings')) ?></span>
      </a>

      <?php if ($isAdmin): ?>
        <a class="<?= is_active('/admin/', $path) ? 'active' : '' ?>" href="/admin/">
          <span class="vm-ico">🛠️</span> <span><?= h($T('Адмінка','Админка','Admin')) ?></span>
        </a>
      <?php endif; ?>

      <a href="/logout.php">
        <span class="vm-ico">🚪</span> <span><?= h($T('Вийти','Выйти','Logout')) ?></span>
      </a>
    <?php else: ?>
      <a class="<?= is_active('/login.php', $path) ? 'active' : '' ?>" href="/login.php">
        <span class="vm-ico">🔑</span> <span><?= h($T('Увійти','Войти','Login')) ?></span>
      </a>
      <a class="<?= is_active('/register.php', $path) ? 'active' : '' ?>" href="/register.php">
        <span class="vm-ico">📝</span> <span><?= h($T('Реєстрація','Регистрация','Register')) ?></span>
      </a>
    <?php endif; ?>
  </nav>
</div>

<?php if ($isAuth): ?>
<script>
(() => {
  if (window.__vmCoinsSidebarLiveInit) return;
  window.__vmCoinsSidebarLiveInit = true;

  const endpoint = '/profile/coins_live.php';
  let inflight = false;

  const updateSidebarBalance = (value) => {
    const n = Number(value);
    const text = Number.isFinite(n) ? String(Math.trunc(n)) : '0';

    document.querySelectorAll('.vm-side-card [data-vmc-balance]').forEach((el) => {
      el.textContent = text;
    });
  };

  const fetchBalance = async () => {
    if (inflight) return;

    inflight = true;
    try {
      const res = await fetch(endpoint + '?_=' + Date.now(), {
        method: 'GET',
        credentials: 'same-origin',
        headers: {
          'Accept': 'application/json',
          'X-Requested-With': 'XMLHttpRequest'
        },
        cache: 'no-store'
      });

      if (!res.ok) return;

      const contentType = String(res.headers.get('content-type') || '');
      if (!contentType.includes('application/json')) return;

      const data = await res.json();
      if (!data || !data.ok) return;

      if (Object.prototype.hasOwnProperty.call(data, 'balance')) {
        updateSidebarBalance(data.balance);
      }
    } catch (e) {
      // silent
    } finally {
      inflight = false;
    }
  };

  window.addEventListener('vmcoins:refresh', () => {
    window.setTimeout(fetchBalance, 50);
  });
})();
</script>
<?php endif; ?>