<?php namespace Laravel\Session;

use Laravel\Config;
use Laravel\Security\Crypter;

class Cookie extends Driver {

	/**
	 * The cookie engine instance.
	 *
	 * @var Cookie_Engine
	 */
	private $cookie;

	/**
	 * The Crypter instance.
	 *
	 * @var Crypter
	 */
	private $crypter;

	/**
	 * Create a new Cookie session driver instance.
	 *
	 * @param  Crypter  $crypter
	 * @param  Cookie   $cookie
	 * @return void
	 */
	public function __construct(Crypter $crypter, Cookie $cookie)
	{
		$this->cookie = $cookie;
		$this->crypter = $crypter;

		if (Config::get('application.key') == '')
		{
			throw new \Exception("You must set an application key before using the Cookie session driver.");
		}
	}

	/**
	 * Load a session by ID.
	 *
	 * The session will be retrieved from persistant storage and returned as an array.
	 * The array contains the session ID, last activity UNIX timestamp, and session data.
	 *
	 * @param  string  $id
	 * @return array
	 */
	protected function load($id)
	{
		if ($this->cookie->has('session_payload'))
		{
			return unserialize($this->crypter->decrypt($this->cookie->get('session_payload')));
		}
	}

	/**
	 * Save the session to persistant storage.
	 *
	 * @return void
	 */
	protected function save()
	{
		if ( ! headers_sent())
		{
			extract(Config::get('session'));

			$payload = $this->crypter->encrypt(serialize($this->session));

			$this->cookie->put('session_payload', $payload, $lifetime, $path, $domain, $https, $http_only);
		}
	}

	/**
	 * Delete the session from persistant storage.
	 *
	 * @return void
	 */
	protected function delete()
	{
		$this->cookie->forget('session_payload');
	}

}