<?php

define("SAVE_PATH", __DIR__ . "/../db");

class Poll
{
	/**
	 * Create a new poll and save it.
	 */
	public static function create_poll($request_data)
	{
		try
		{
			$poll = new Poll();
			$poll->title = $request_data->title;
			$poll->creation_date = (new DateTime())->getTimestamp();
			$id = 0;
			foreach ($request_data->options as $option)
			{
				$poll->options[] = [
					"id" => $id,
					"label" => $option,
					"votes" => 0,
				];
				$id++;
			}
			$poll->gen_new_id();
			$poll->save();
			return $poll;
		}
		catch (Exception $e)
		{ return false; }
	}

	/**
	 * Try to load an existing poll.
	 * @param string id - Poll ID.
	 * @return boolean|Poll - Requested poll if found, false otherwise.
	 */
	public static function load_poll($id)
	{
		$db = dba_open(SAVE_PATH . "/polls.db", "rd");

		if (dba_exists($id, $db))
		{
			$poll = new Poll();
			$saved_poll_data = json_decode(dba_fetch($id, $db));
			$poll->id = $id;
			$poll->title = $saved_poll_data->title;
			$poll->creation_date = $saved_poll_data->creation_date;
			$poll->options = $saved_poll_data->options;

			dba_close($db);
			return $poll;
		}
		else
		{
			dba_close($db);
			return false;
		}
	}

	public $id = null;
	public $title;
	public $creation_date;
	public $options = [];

	public function gen_new_id()
	{
		$db = dba_open(SAVE_PATH . "/polls.db", "rd");

		function gen_id()
		{ return bin2hex(openssl_random_pseudo_bytes(16)); }

		do
		{ $new_id = gen_id(); }
		while(dba_exists($new_id, $db));

		dba_close($db);
		$this->id = $new_id;
	}

	public function save()
	{
		$db = dba_open(SAVE_PATH . "/polls.db", "wd");
		$func = (dba_exists($this->id, $db) ? "dba_replace" : "dba_insert");
		$func($this->id, json_encode([
			"title" => $this->title,
			"creation_date" => $this->creation_date,
			"options" => $this->options,
		]), $db);
		dba_close($db);
	}
}