<?php

/*
 * This file is part of the FileGator package.
 *
 * (c) Milos Stojanovic <alcalbg@gmail.com>
 *
 * For the full copyright and license information, please view the LICENSE file
 */

namespace Filegator\Services\Session\Adapters;

use Filegator\Kernel\Request;
use Filegator\Services\Service;
use Filegator\Services\Session\Session;
use Filegator\Services\Session\SessionStorageInterface;

class SessionStorage implements Service, SessionStorageInterface
{
    protected $request;

    protected $config;

    public function __construct(Request $request)
    {
        $this->request = $request;
    }

    public function init(array $config = [])
    {
        // we don't have a previous session attached
        if (! $this->getSession()) {
            $handler = $config['handler'];
            $session = new Session($handler());
            $session->setName('filegator');

            $this->setSession($session);
        }
    }

    public function save()
    {
        $this->getSession()->save();
    }

    public function set(string $key, $data)
    {
        return $this->getSession()->set($key, $data);
    }

    public function get(string $key, $default = null)
    {
        return $this->getSession() ? $this->getSession()->get($key, $default) : $default;
    }

    public function invalidate()
    {
        if (! $this->getSession()->isStarted()) {
            $this->getSession()->start();
        }

        $this->getSession()->invalidate();
    }

    private function setSession(Session $session)
    {
        return $this->request->setSession($session);
    }

    private function getSession(): ?Session
    {
        return $this->request->getSession();
    }
}
