<?php
/**
 * Kontroler Aktywne sesje - przegląd aktywnych użytkowników (admin/reseller)
 */

require_once __DIR__ . '/BaseController.php';

class SessionController extends BaseController
{
    private Database $db;
    private User $userModel;

    public function __construct()
    {
        parent::__construct();
        $this->db = Database::getInstance();
        $this->userModel = new User();
        
        // Upewnij się że kolumna last_activity istnieje
        $this->ensureLastActivityColumn();
    }

    /**
     * Lista aktywnych sesji
     */
    public function index(): void
    {
        // Tylko admin i reseller mają dostęp
        if (!$this->auth->isManager()) {
            $this->redirect('/', 'danger', 'Brak dostępu.');
            return;
        }

        // Pobierz ID użytkowników widocznych dla managera
        $visibleUserIds = $this->userModel->getVisibleUserIds($this->currentUser);
        
        if (empty($visibleUserIds)) {
            $visibleUserIds = [0]; // Żaden użytkownik
        }
        
        $placeholders = implode(',', array_fill(0, count($visibleUserIds), '?'));

        // Pobierz sesje aktywne w ciągu ostatnich 10 minut
        $activeSessions = $this->db->fetchAll(
            "SELECT s.*, u.username, u.role,
                    datetime(s.last_activity, 'localtime') as last_activity_local,
                    datetime(s.created_at, 'localtime') as created_at_local
             FROM sessions s
             JOIN users u ON s.user_id = u.id
             WHERE s.last_activity > datetime('now', '-10 minutes')
               AND s.expires_at > datetime('now')
               AND u.id IN ({$placeholders})
             ORDER BY s.last_activity DESC",
            $visibleUserIds
        );

        // Pobierz wszystkie aktywne sesje (nie wygasłe)
        $allSessions = $this->db->fetchAll(
            "SELECT s.*, u.username, u.role,
                    datetime(s.last_activity, 'localtime') as last_activity_local,
                    datetime(s.created_at, 'localtime') as created_at_local
             FROM sessions s
             JOIN users u ON s.user_id = u.id
             WHERE s.expires_at > datetime('now')
               AND u.id IN ({$placeholders})
             ORDER BY s.last_activity DESC",
            $visibleUserIds
        );

        // Statystyki
        $stats = [
            'active_now' => count($activeSessions),
            'total_sessions' => count($allSessions),
            'remember_me_sessions' => count(array_filter($allSessions, function($s) { return $s['remember_me']; }))
        ];

        $this->render('sessions/index.tpl', [
            'pageTitle' => 'Aktywne sesje',
            'activeSessions' => $activeSessions,
            'allSessions' => $allSessions,
            'stats' => $stats
        ]);
    }

    /**
     * Usuń sesję (wyloguj użytkownika)
     */
    public function terminate(): void
    {
        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            $this->redirect('admin/sessions');
            return;
        }

        if (!$this->verifyCsrf()) {
            return;
        }

        // Tylko admin i reseller mają dostęp
        if (!$this->auth->isManager()) {
            $this->redirect('/', 'danger', 'Brak dostępu.');
            return;
        }

        $sessionId = (int)post('session_id', 0);
        
        if ($sessionId <= 0) {
            $this->redirect('admin/sessions', 'danger', 'Nieprawidłowa sesja.');
            return;
        }

        // Pobierz info o sesji
        $session = $this->db->fetchOne(
            "SELECT s.*, u.username, u.id as owner_id FROM sessions s JOIN users u ON s.user_id = u.id WHERE s.id = :id",
            ['id' => $sessionId]
        );

        if (!$session) {
            $this->redirect('admin/sessions', 'danger', 'Sesja nie istnieje.');
            return;
        }

        // Sprawdź czy manager może zarządzać tym użytkownikiem
        if (!$this->canAccess($session['owner_id'])) {
            $this->redirect('admin/sessions', 'danger', 'Brak dostępu do tej sesji.');
            return;
        }

        // Usuń sesję
        $this->db->execute("DELETE FROM sessions WHERE id = :id", ['id' => $sessionId]);

        $this->logger->log(
            'session_terminated',
            "Zakończono sesję użytkownika: {$session['username']} (IP: {$session['ip']})",
            $this->currentUser['id']
        );

        if (isAjax()) {
            $this->json(['success' => true, 'message' => 'Sesja została zakończona.']);
        } else {
            $this->redirect('admin/sessions', 'success', "Sesja użytkownika {$session['username']} została zakończona.");
        }
    }

    /**
     * Upewnij się że kolumna last_activity istnieje
     */
    private function ensureLastActivityColumn(): void
    {
        // Sprawdź czy kolumna istnieje
        $columns = $this->db->fetchAll("PRAGMA table_info(sessions)");
        $hasLastActivity = false;
        
        foreach ($columns as $col) {
            if ($col['name'] === 'last_activity') {
                $hasLastActivity = true;
                break;
            }
        }

        if (!$hasLastActivity) {
            $this->db->execute("ALTER TABLE sessions ADD COLUMN last_activity DATETIME DEFAULT CURRENT_TIMESTAMP");
            // Ustaw last_activity dla istniejących sesji
            $this->db->execute("UPDATE sessions SET last_activity = created_at WHERE last_activity IS NULL");
        }
    }
}
