<?php

namespace App\Services;

use App\Models\Poll;
use App\Models\PollVote;
use App\Status;
use Illuminate\Support\Facades\Cache;

class PollService
{
	const CACHE_KEY = 'pf:services:poll:status_id:';

	public static function get($id, $profileId = false)
	{
		$key = self::CACHE_KEY . $id;

		$res = Cache::remember($key, 1800, function() use($id) {
			$poll = Poll::whereStatusId($id)->firstOrFail();
			return [
				'id' => (string) $poll->id,
				'expires_at' => str_replace('+00:00', 'Z', $poll->expires_at->format(DATE_RFC3339_EXTENDED)),
				'expired' => null,
				'multiple' => $poll->multiple,
				'votes_count' => $poll->votes_count,
				'voters_count' => null,
				'voted' => false,
				'own_votes' => [],
				'options' => collect($poll->poll_options)->map(function($option, $key) use($poll) {
					$tally = $poll->cached_tallies && isset($poll->cached_tallies[$key]) ? $poll->cached_tallies[$key] : 0;
					return [
						'title' => $option,
						'votes_count' => $tally
					];
				})->toArray(),
				'emojis' => []
			];
		});

		if($profileId) {
			$res['voted'] = self::voted($id, $profileId);
			$res['own_votes'] = self::ownVotes($id, $profileId);
		}

		return $res;
	}

	public static function getById($id, $pid)
	{
		$poll = Poll::findOrFail($id);
		return self::get($poll->status_id, $pid);
	}

	public static function del($id)
	{
		Cache::forget(self::CACHE_KEY . $id);
	}

	public static function voted($id, $profileId = false)
	{
		return !$profileId ? false : PollVote::whereStatusId($id)
			->whereProfileId($profileId)
			->exists();
	}

	public static function votedStory($id, $profileId = false)
	{
		return !$profileId ? false : PollVote::whereStoryId($id)
			->whereProfileId($profileId)
			->exists();
	}

	public static function storyResults($sid)
	{
		$key = self::CACHE_KEY . 'story_poll_results:' . $sid;
		return Cache::remember($key, 60, function() use($sid) {
			return Poll::whereStoryId($sid)
			->firstOrFail()
			->cached_tallies;
		});
	}

	public static function storyChoice($id, $profileId = false)
	{
		return !$profileId ? false : PollVote::whereStoryId($id)
			->whereProfileId($profileId)
			->pluck('choice')
			->first();
	}

	public static function ownVotes($id, $profileId = false)
	{
		return !$profileId ? [] : PollVote::whereStatusId($id)
			->whereProfileId($profileId)
			->pluck('choice') ?? [];
	}
}