<?php

// Handles anything to do with sessions
class Session
{
    public function __construct()
    {
        // Start new session if there is none
        if (session_status() === PHP_SESSION_NONE)
        {
            session_start();
        }
    }

    public function has(string $key): bool
    {
        return array_key_exists($key, $_SESSION);
    }

    // Returns mixed but php 7.4 DOES NOT SUPPORT THAT TYPE HINT >:((
    public function get(string $key)
    {
        if ($this->has($key))
        {
            return $_SESSION[$key];
        }
        return NULL;
    }

    public function set(string $key, $value): void 
    {
        $_SESSION[$key] = $value;
    }

    public function remove(string $key): void
    {
        if ($this->has($key))
        {
            unset($_SESSION[$key]);
        }
    }

    public function clear(): void
    {
        session_unset();
    }

    // TODO: throwaway code; rewrite for readability and also implement proper flashing by removing messages after one request
    public function flash(string $msg, string $type = 'info'): void
    {
        $types = [
            "info",
            "success",
            "danger",
            "warning"
        ];
        if (!in_array($type, $types)) {
            throw new Exception("Flash type: \"$type\" does not exist");
        }
        $key = 'flashed_messages';
        if (!$this->has($key))
        {
            $this->set($key, []);
        }
        if (count($this->get($key)) >= 100)
        {
            $this->remove($key);
            throw new Exception('Too many flashed messages!');
        }
        $msgs = $this->get($key);
        $msgs[] = [
            "message"  => htmlspecialchars($msg),
            "type" => $type
        ];
        $this->set(
            $key,
            $msgs
        );
    }

    public function getFlashedMessages(): ?array
    {
        $key = 'flashed_messages';
        if ($this->has($key))
        {
            $msgs = $this->get($key);
            $this->remove($key);
            return $msgs;
        }
        return NULL;
    }
    // END TODO;
}