<?php
declare(strict_types=1);

/**
 * /functional/friends/index.php
 * Сторінка “Мої друзі”:
 * - зверху 2 колонки:
 *   1) Ті, хто вам надіслав запит (incoming pending) + кнопки Прийняти/Відхилити
 *   2) Ті, кому ви надіслали (outgoing pending + declined) + кнопки Скасувати / Підписатися
 * - нижче: “Мої друзі” (accepted) + фільтр стать + сортування за датою додавання + пагінація
 *
 * SEO: приватна/персоналізована зона => noindex
 */

require_once __DIR__ . '/../../includes/start.php';
require_login();

/** @var PDO|null $pdo */
/** @var array|null $me */
$pdo = (isset($pdo) && $pdo instanceof PDO) ? $pdo : db();
$me  = $me ?? current_user();
$meId = (int)($me['id'] ?? 0);

require_once __DIR__ . '/_lib.php';

$lang = (string)($_SESSION['lang'] ?? '');
if ($lang === '' && is_array($me)) $lang = (string)($me['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;
};

$title = $T('Мої друзі', 'Мои друзья', 'My friends');

/* SEO + no-cache */
$meta_robots = 'noindex, nofollow, noarchive, nosnippet';
$meta_desc   = '';
$canonical   = function_exists('abs_url') ? abs_url('/functional/friends/') : '/functional/friends/';
$seo_noindex = true;

if (!headers_sent()) {
    header('X-Robots-Tag: ' . $meta_robots, true);
    header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0', true);
    header('Pragma: no-cache', true);
    header('Expires: 0', true);
}

if ($meId <= 0) { http_response_code(403); echo "Forbidden"; exit; }
if (!vm_friends_ready($pdo)) { http_response_code(500); echo "DB tables missing: friend_requests/user_follows"; exit; }

$csrf = vm_csrf_token();

/* filters */
$gender = (string)($_GET['gender'] ?? 'all'); // all|m|f
if (!in_array($gender, ['all', 'm', 'f'], true)) $gender = 'all';

$sort = (string)($_GET['sort'] ?? 'new'); // new|old
if (!in_array($sort, ['new', 'old'], true)) $sort = 'new';

$page = (int)($_GET['page'] ?? 1);
if ($page < 1) $page = 1;

$per = 50;
if (isset($_GET['per'])) {
    $perTry = (int)$_GET['per'];
    if ($perTry >= 10 && $perTry <= 200) $per = $perTry;
}

/* result message */
$resultMsg = trim((string)($_GET['r'] ?? ''));
$flash = '';
if ($resultMsg !== '') {
    $flash = match ($resultMsg) {
        'sent' => $T('Запит у друзі надіслано.', 'Заявка в друзья отправлена.', 'Friend request sent.'),
        'accepted' => $T('Ви стали друзями.', 'Вы стали друзьями.', 'You are now friends.'),
        'ok' => $T('Готово.', 'Готово.', 'Done.'),
        'already_friends' => $T('Ви вже друзі.', 'Вы уже друзьями.', 'Already friends.'),
        'already_sent' => $T('Запит уже відправлено.', 'Заявка уже отправлена.', 'Request already sent.'),
        'friends_no_follow' => $T('Не можна підписатися, бо ви друзі.', 'Нельзя подписаться, вы друзья.', 'You can’t follow friends.'),
        'pending_no_follow' => $T('Не можна підписатися, поки є запит у друзі.', 'Нельзя подписаться, пока есть заявка.', 'You can’t follow while a friend request is pending.'),
        'already' => $T('Ви вже підписані.', 'Вы уже подписаны.', 'Already following.'),
        'no_pending' => $T('Немає активного запиту.', 'Нет активной заявки.', 'No active request.'),
        'not_friends' => $T('Ви не друзі.', 'Вы не друзья.', 'Not friends.'),
        'no' => $T('Ви не підписані.', 'Вы не подписаны.', 'Not following.'),
        'self' => $T('Неможливо виконати дію із собою.', 'Нельзя выполнить действие с собой.', 'You can’t do that to yourself.'),
        'csrf' => $T('Помилка безпеки (CSRF). Оновіть сторінку.', 'Ошибка безопасности (CSRF). Обновите страницу.', 'Security error (CSRF). Refresh the page.'),
        default => $T('Операцію виконано.', 'Операция выполнена.', 'Action completed.'),
    };
}

$backBase = '/functional/friends/?gender=' . urlencode($gender) . '&sort=' . urlencode($sort) . '&per=' . $per;

/* ===== incoming pending ===== */
$st = $pdo->prepare("
  SELECT fr.id, fr.from_user_id, fr.created_at,
         u.id AS uid, u.username, u.first_name, u.last_name, u.full_name, u.avatar_path, u.gender
  FROM friend_requests fr
  JOIN users u ON u.id = fr.from_user_id
  WHERE fr.to_user_id=? AND fr.status='pending'
  ORDER BY fr.created_at DESC
  LIMIT 200
");
$st->execute([$meId]);
$incoming = $st->fetchAll(PDO::FETCH_ASSOC) ?: [];

/* ===== outgoing (pending + declined) ===== */
$st = $pdo->prepare("
  SELECT fr.id, fr.to_user_id, fr.status, fr.created_at, fr.responded_at,
         u.id AS uid, u.username, u.first_name, u.last_name, u.full_name, u.avatar_path, u.gender
  FROM friend_requests fr
  JOIN users u ON u.id = fr.to_user_id
  WHERE fr.from_user_id=? AND fr.status IN ('pending','declined')
  ORDER BY fr.created_at DESC
  LIMIT 200
");
$st->execute([$meId]);
$outgoing = $st->fetchAll(PDO::FETCH_ASSOC) ?: [];

/* ===== follow map for outgoing declined list ===== */
$followMap = [];
if (!empty($outgoing)) {
    $ids = [];
    foreach ($outgoing as $r) $ids[] = (int)($r['uid'] ?? 0);
    $ids = array_values(array_unique(array_filter($ids, fn($x) => $x > 0)));
    if ($ids) {
        $in = implode(',', array_fill(0, count($ids), '?'));
        $q = $pdo->prepare("SELECT followee_user_id FROM user_follows WHERE follower_user_id=? AND followee_user_id IN ($in)");
        $q->execute(array_merge([$meId], $ids));
        $rows = $q->fetchAll(PDO::FETCH_ASSOC) ?: [];
        foreach ($rows as $rr) $followMap[(int)$rr['followee_user_id']] = true;
    }
}

/* ===== my friends (accepted) + pagination ===== */
$order = ($sort === 'old') ? 'ASC' : 'DESC';
$offset = ($page - 1) * $per;

$sqlCount = "
  SELECT COUNT(*)
  FROM friend_requests fr
  JOIN users u
    ON u.id = CASE WHEN fr.from_user_id=? THEN fr.to_user_id ELSE fr.from_user_id END
  WHERE fr.status='accepted'
    AND (fr.from_user_id=? OR fr.to_user_id=?)
";
$countParams = [$meId, $meId, $meId];
if ($gender !== 'all') {
    $sqlCount .= " AND u.gender=? ";
    $countParams[] = $gender;
}
$st = $pdo->prepare($sqlCount);
$st->execute($countParams);
$totalFriends = (int)($st->fetchColumn() ?: 0);

$sqlFriends = "
  SELECT
    fr.id,
    fr.from_user_id, fr.to_user_id,
    COALESCE(fr.accepted_at, fr.responded_at, fr.created_at) AS added_at,
    u.id AS uid, u.username, u.first_name, u.last_name, u.full_name, u.avatar_path, u.gender
  FROM friend_requests fr
  JOIN users u
    ON u.id = CASE WHEN fr.from_user_id=? THEN fr.to_user_id ELSE fr.from_user_id END
  WHERE fr.status='accepted'
    AND (fr.from_user_id=? OR fr.to_user_id=?)
";
$params = [$meId, $meId, $meId];

if ($gender !== 'all') {
    $sqlFriends .= " AND u.gender=? ";
    $params[] = $gender;
}

$sqlFriends .= " ORDER BY added_at $order LIMIT $per OFFSET $offset";

$st = $pdo->prepare($sqlFriends);
$st->execute($params);
$friends = $st->fetchAll(PDO::FETCH_ASSOC) ?: [];

$totalPages = (int)max(1, (int)ceil($totalFriends / max(1, $per)));
if ($page > $totalPages) {
    $page = $totalPages;
}

/* view helpers (уникаємо redeclare) */
if (!function_exists('vm_avatar_html_friends')) {
    function vm_avatar_html_friends(array $u): string
    {
        $a = trim((string)($u['avatar_path'] ?? ''));
        if ($a === '') {
            return '<div style="width:42px;height:42px;border-radius:12px;background:rgba(0,0,0,.08);"></div>';
        }
        return '<img src="' . h($a) . '" alt="" loading="lazy" style="width:42px;height:42px;border-radius:12px;object-fit:cover;">';
    }
}

if (!function_exists('vm_profile_url_friends')) {
    function vm_profile_url_friends(array $u): string
    {
        $un = trim((string)($u['username'] ?? ''));
        if ($un === '') return '/profile/';
        return '/profile/?u=' . urlencode($un);
    }
}

if (!function_exists('vm_label_friends')) {
    function vm_label_friends(array $u): string
    {
        return function_exists('vm_user_label') ? vm_user_label($u) : trim((string)($u['username'] ?? ''));
    }
}

$confirmRemove = $T('Видалити з друзів?', 'Удалить из друзей?', 'Remove from friends?');
$confirmCancel = $T('Скасувати запит?', 'Отменить заявку?', 'Cancel request?');
$confirmDecline = $T('Відхилити запит?', 'Отклонить заявку?', 'Decline request?');

require_once __DIR__ . '/../../includes/header.php';
?>
<div class="container my-3">
  <div class="row g-3">
    <div class="col-lg-3">
      <?php
        $p = __DIR__ . '/../../blocks/profile.php';
        if (is_file($p)) require $p;
      ?>
    </div>

    <div class="col-lg-6">
      <?php if ($flash !== ''): ?>
        <div class="alert alert-info"><?= h($flash) ?></div>
      <?php endif; ?>

      <div class="card mb-3">
        <div class="card-body">
          <div class="d-flex align-items-center justify-content-between gap-2 flex-wrap">
            <h1 class="h5 mb-0"><?= h($title) ?></h1>
            <div class="text-muted small">
              <?= h($T(
                'Друзі — взаємний доступ. Підписка — тільки стрічка, без дружби.',
                'Друзья — взаимный доступ. Подписка — только лента, без дружбы.',
                'Friends = mutual access. Follow = feed only.'
              )) ?>
            </div>
          </div>
        </div>
      </div>

      <div class="row g-3">
        <!-- Incoming -->
        <div class="col-md-6">
          <div class="card">
            <div class="card-header fw-bold">
              <?= h($T('Вам надіслали запит', 'Вам отправили заявку', 'Incoming requests')) ?>
              <span class="text-muted">(<?= count($incoming) ?>)</span>
            </div>
            <div class="card-body p-0">
              <?php if (!$incoming): ?>
                <div class="p-3 text-muted"><?= h($T('Немає заявок.', 'Нет заявок.', 'No requests.')) ?></div>
              <?php else: ?>
                <div class="list-group list-group-flush">
                  <?php foreach ($incoming as $u): ?>
                    <div class="list-group-item">
                      <div class="d-flex gap-2">
                        <a href="<?= h(vm_profile_url_friends($u)) ?>" style="text-decoration:none;">
                          <?= vm_avatar_html_friends($u) ?>
                        </a>
                        <div class="flex-grow-1">
                          <div class="fw-semibold">
                            <a href="<?= h(vm_profile_url_friends($u)) ?>" style="text-decoration:none;">
                              <?= h(vm_label_friends($u)) ?>
                            </a>
                          </div>
                          <div class="text-muted small">@<?= h((string)($u['username'] ?? '')) ?></div>

                          <div class="mt-2 d-flex gap-2 flex-wrap">
                            <form method="post" action="/functional/friends/action.php" class="m-0">
                              <input type="hidden" name="csrf" value="<?= h($csrf) ?>">
                              <input type="hidden" name="do" value="accept_friend">
                              <input type="hidden" name="user_id" value="<?= (int)($u['uid'] ?? 0) ?>">
                              <input type="hidden" name="back" value="<?= h($backBase . '&page=' . $page) ?>">
                              <button class="btn btn-sm btn-success"><?= h($T('Прийняти','Принять','Accept')) ?></button>
                            </form>

                            <form method="post" action="/functional/friends/action.php" class="m-0" onsubmit="return confirm('<?= h($confirmDecline) ?>');">
                              <input type="hidden" name="csrf" value="<?= h($csrf) ?>">
                              <input type="hidden" name="do" value="decline_friend">
                              <input type="hidden" name="user_id" value="<?= (int)($u['uid'] ?? 0) ?>">
                              <input type="hidden" name="back" value="<?= h($backBase . '&page=' . $page) ?>">
                              <button class="btn btn-sm btn-outline-danger"><?= h($T('Відхилити','Отклонить','Decline')) ?></button>
                            </form>
                          </div>
                        </div>
                      </div>
                    </div>
                  <?php endforeach; ?>
                </div>
              <?php endif; ?>
            </div>
          </div>
        </div>

        <!-- Outgoing -->
        <div class="col-md-6">
          <div class="card">
            <div class="card-header fw-bold">
              <?= h($T('Ви надіслали запит', 'Вы отправили заявку', 'Outgoing requests')) ?>
              <span class="text-muted">(<?= count($outgoing) ?>)</span>
            </div>
            <div class="card-body p-0">
              <?php if (!$outgoing): ?>
                <div class="p-3 text-muted"><?= h($T('Немає заявок.', 'Нет заявок.', 'No requests.')) ?></div>
              <?php else: ?>
                <div class="list-group list-group-flush">
                  <?php foreach ($outgoing as $u): ?>
                    <?php
                      $status = (string)($u['status'] ?? '');
                      $isDeclined = ($status === 'declined');
                      $uid = (int)($u['uid'] ?? 0);
                      $isFollowing = $uid > 0 && !empty($followMap[$uid]);
                    ?>
                    <div class="list-group-item">
                      <div class="d-flex gap-2">
                        <a href="<?= h(vm_profile_url_friends($u)) ?>" style="text-decoration:none;">
                          <?= vm_avatar_html_friends($u) ?>
                        </a>
                        <div class="flex-grow-1">
                          <div class="fw-semibold">
                            <a href="<?= h(vm_profile_url_friends($u)) ?>" style="text-decoration:none;">
                              <?= h(vm_label_friends($u)) ?>
                            </a>
                          </div>
                          <div class="text-muted small">@<?= h((string)($u['username'] ?? '')) ?></div>

                          <?php if ($isDeclined): ?>
                            <div class="small mt-1" style="color:#b00020;">
                              <?= h($T('Запит відхилено (можна підписатися).','Заявка отклонена (можно подписаться).','Request declined (you can follow).')) ?>
                            </div>
                          <?php else: ?>
                            <div class="small mt-1 text-muted">
                              <?= h($T('Очікує відповіді.','Ожидает ответа.','Pending.')) ?>
                            </div>
                          <?php endif; ?>

                          <div class="mt-2 d-flex gap-2 flex-wrap">
                            <?php if (!$isDeclined): ?>
                              <form method="post" action="/functional/friends/action.php" class="m-0" onsubmit="return confirm('<?= h($confirmCancel) ?>');">
                                <input type="hidden" name="csrf" value="<?= h($csrf) ?>">
                                <input type="hidden" name="do" value="cancel_friend">
                                <input type="hidden" name="user_id" value="<?= (int)($u['uid'] ?? 0) ?>">
                                <input type="hidden" name="back" value="<?= h($backBase . '&page=' . $page) ?>">
                                <button class="btn btn-sm btn-outline-secondary"><?= h($T('Скасувати','Отменить','Cancel')) ?></button>
                              </form>
                            <?php else: ?>
                              <?php if (!$isFollowing): ?>
                                <form method="post" action="/functional/friends/action.php" class="m-0">
                                  <input type="hidden" name="csrf" value="<?= h($csrf) ?>">
                                  <input type="hidden" name="do" value="follow">
                                  <input type="hidden" name="user_id" value="<?= (int)($u['uid'] ?? 0) ?>">
                                  <input type="hidden" name="back" value="<?= h($backBase . '&page=' . $page) ?>">
                                  <button class="btn btn-sm btn-primary"><?= h($T('Підписатися','Подписаться','Follow')) ?></button>
                                </form>
                              <?php else: ?>
                                <form method="post" action="/functional/friends/action.php" class="m-0">
                                  <input type="hidden" name="csrf" value="<?= h($csrf) ?>">
                                  <input type="hidden" name="do" value="unfollow">
                                  <input type="hidden" name="user_id" value="<?= (int)($u['uid'] ?? 0) ?>">
                                  <input type="hidden" name="back" value="<?= h($backBase . '&page=' . $page) ?>">
                                  <button class="btn btn-sm btn-outline-primary"><?= h($T('Відписатися','Отписаться','Unfollow')) ?></button>
                                </form>
                              <?php endif; ?>

                              <form method="post" action="/functional/friends/action.php" class="m-0">
                                <input type="hidden" name="csrf" value="<?= h($csrf) ?>">
                                <input type="hidden" name="do" value="send_friend">
                                <input type="hidden" name="user_id" value="<?= (int)($u['uid'] ?? 0) ?>">
                                <input type="hidden" name="back" value="<?= h($backBase . '&page=' . $page) ?>">
                                <button class="btn btn-sm btn-outline-success"><?= h($T('Надіслати знову','Отправить снова','Send again')) ?></button>
                              </form>
                            <?php endif; ?>
                          </div>

                        </div>
                      </div>
                    </div>
                  <?php endforeach; ?>
                </div>
              <?php endif; ?>
            </div>
          </div>
        </div>
      </div>

      <!-- Friends list -->
      <div class="card mt-3">
        <div class="card-header d-flex align-items-center justify-content-between gap-2 flex-wrap">
          <div class="fw-bold">
            <?= h($T('Мої друзі', 'Мои друзья', 'My friends')) ?>
            <span class="text-muted">(<?= $totalFriends ?>)</span>
          </div>

          <form method="get" action="/functional/friends/" class="d-flex gap-2 align-items-center m-0 flex-wrap">
            <label class="small text-muted"><?= h($T('Стать','Пол','Gender')) ?></label>
            <select name="gender" class="form-select form-select-sm" style="width:auto;">
              <option value="all" <?= $gender==='all'?'selected':'' ?>><?= h($T('Усі','Все','All')) ?></option>
              <option value="m" <?= $gender==='m'?'selected':'' ?>><?= h($T('Чоловіки','Мужчины','Men')) ?></option>
              <option value="f" <?= $gender==='f'?'selected':'' ?>><?= h($T('Жінки','Женщины','Women')) ?></option>
            </select>

            <label class="small text-muted"><?= h($T('Сортування','Сортировка','Sort')) ?></label>
            <select name="sort" class="form-select form-select-sm" style="width:auto;">
              <option value="new" <?= $sort==='new'?'selected':'' ?>><?= h($T('Від нових','С новых','Newest')) ?></option>
              <option value="old" <?= $sort==='old'?'selected':'' ?>><?= h($T('Від старих','Со старых','Oldest')) ?></option>
            </select>

            <input type="hidden" name="per" value="<?= (int)$per ?>">
            <button class="btn btn-sm btn-outline-primary"><?= h($T('Застосувати','Применить','Apply')) ?></button>
          </form>
        </div>

        <div class="card-body p-0">
          <?php if (!$friends): ?>
            <div class="p-3 text-muted"><?= h($T('Друзів поки немає.', 'Друзей пока нет.', 'No friends yet.')) ?></div>
          <?php else: ?>
            <div class="list-group list-group-flush">
              <?php foreach ($friends as $u): ?>
                <div class="list-group-item">
                  <div class="d-flex gap-2 align-items-center">
                    <a href="<?= h(vm_profile_url_friends($u)) ?>" style="text-decoration:none;">
                      <?= vm_avatar_html_friends($u) ?>
                    </a>
                    <div class="flex-grow-1">
                      <div class="fw-semibold">
                        <a href="<?= h(vm_profile_url_friends($u)) ?>" style="text-decoration:none;">
                          <?= h(vm_label_friends($u)) ?>
                        </a>
                      </div>
                      <div class="text-muted small">@<?= h((string)($u['username'] ?? '')) ?></div>
                    </div>

                    <form method="post" action="/functional/friends/action.php" class="m-0" onsubmit="return confirm('<?= h($confirmRemove) ?>');">
                      <input type="hidden" name="csrf" value="<?= h($csrf) ?>">
                      <input type="hidden" name="do" value="remove_friend">
                      <input type="hidden" name="user_id" value="<?= (int)($u['uid'] ?? 0) ?>">
                      <input type="hidden" name="back" value="<?= h($backBase . '&page=' . $page) ?>">
                      <button class="btn btn-sm btn-outline-danger"><?= h($T('Видалити','Удалить','Remove')) ?></button>
                    </form>
                  </div>
                </div>
              <?php endforeach; ?>
            </div>

            <?php if ($totalPages > 1): ?>
              <div class="p-3 d-flex align-items-center justify-content-between flex-wrap gap-2">
                <div class="text-muted small">
                  <?= h($T('Сторінка','Страница','Page')) ?> <?= (int)$page ?> / <?= (int)$totalPages ?>
                </div>

                <nav aria-label="Friends pagination">
                  <ul class="pagination pagination-sm mb-0">
                    <?php
                      $mk = function(int $p) use ($backBase): string {
                        return $backBase . '&page=' . $p;
                      };
                      $prev = max(1, $page - 1);
                      $next = min($totalPages, $page + 1);
                    ?>
                    <li class="page-item <?= $page<=1?'disabled':'' ?>">
                      <a class="page-link" href="<?= h($mk($prev)) ?>">&laquo;</a>
                    </li>

                    <?php
                      $start = max(1, $page - 2);
                      $end   = min($totalPages, $page + 2);
                      for ($p = $start; $p <= $end; $p++):
                    ?>
                      <li class="page-item <?= $p===$page?'active':'' ?>">
                        <a class="page-link" href="<?= h($mk($p)) ?>"><?= (int)$p ?></a>
                      </li>
                    <?php endfor; ?>

                    <li class="page-item <?= $page>=$totalPages?'disabled':'' ?>">
                      <a class="page-link" href="<?= h($mk($next)) ?>">&raquo;</a>
                    </li>
                  </ul>
                </nav>
              </div>
            <?php endif; ?>

          <?php endif; ?>
        </div>
      </div>

    </div>

    <div class="col-lg-3">
      <?php
        $r = __DIR__ . '/../../blocks/groups.php';
        if (is_file($r)) require $r;
      ?>
    </div>
  </div>
</div>
<?php require_once __DIR__ . '/../../includes/footer.php'; ?>