<?php
/**
 * UserSession Model
 * Handles persistent "Remember-Me" tokens
 */

require_once __DIR__ . '/../Core/Model.php';

class UserSession extends Model {
    protected string $table = 'user_sessions';

    public function createRememberSession(int $userId, int $lifetimeSeconds = 2592000): string {
        $rawToken = bin2hex(random_bytes(32));
        $hashedToken = hash('sha256', $rawToken);
        $expiresAt = date('Y-m-d H:i:s', time() + $lifetimeSeconds);

        $this->insert([
            'user_id' => $userId,
            'token' => $hashedToken,
            'ip_address' => Security::getClientIp(),
            'user_agent' => Security::getUserAgent(),
            'expires_at' => $expiresAt,
            'created_at' => date('Y-m-d H:i:s')
        ]);

        return $rawToken;
    }

    public function findValidSession(string $rawToken): ?array {
        $hashedToken = hash('sha256', $rawToken);
        $sql = "SELECT us.*, u.status as user_status FROM `user_sessions` us 
                JOIN `users` u ON us.user_id = u.id 
                WHERE us.token = :token AND us.expires_at > NOW() AND u.status = 'active' AND u.deleted_at IS NULL LIMIT 1";
        return $this->fetchOne($sql, [':token' => $hashedToken]);
    }

    public function removeSessionByToken(string $rawToken): void {
        $hashedToken = hash('sha256', $rawToken);
        $sql = "DELETE FROM `user_sessions` WHERE `token` = :token";
        $this->query($sql, [':token' => $hashedToken]);
    }

    public function removeAllForUser(int $userId): void {
        $sql = "DELETE FROM `user_sessions` WHERE `user_id` = :user_id";
        $this->query($sql, [':user_id' => $userId]);
    }

    public function getActiveSessions(int $userId): array {
        $sql = "SELECT * FROM `user_sessions` WHERE `user_id` = :user_id AND `expires_at` > NOW() ORDER BY `created_at` DESC";
        return $this->fetchAll($sql, [':user_id' => $userId]);
    }
}
