<?php

namespace App\Services;

use Illuminate\Support\Facades\Cache;
use App\Follower;
use App\FollowRequest;
use App\Profile;
use App\UserFilter;

class RelationshipService
{
	const CACHE_KEY = 'pf:services:urel:';

	public static function get($aid, $tid)
	{
		$actor = AccountService::get($aid, true);
		$target = AccountService::get($tid, true);
		if(!$actor || !$target) {
			return self::defaultRelation($tid);
		}

		if($actor['id'] === $target['id']) {
			return self::defaultRelation($tid);
		}

		return Cache::remember(self::key("a_{$aid}:t_{$tid}"), 1209600, function() use($aid, $tid) {
			return [
				'id' => (string) $tid,
				'following' => Follower::whereProfileId($aid)->whereFollowingId($tid)->exists(),
				'followed_by' => Follower::whereProfileId($tid)->whereFollowingId($aid)->exists(),
				'blocking' => UserFilter::whereUserId($aid)
					->whereFilterableType('App\Profile')
					->whereFilterableId($tid)
					->whereFilterType('block')
					->exists(),
				'muting' => UserFilter::whereUserId($aid)
					->whereFilterableType('App\Profile')
					->whereFilterableId($tid)
					->whereFilterType('mute')
					->exists(),
				'muting_notifications' => null,
				'requested' => FollowRequest::whereFollowerId($aid)
					->whereFollowingId($tid)
					->exists(),
				'domain_blocking' => null,
				'showing_reblogs' => null,
				'endorsed' => false
			];
		});
	}

	public static function delete($aid, $tid)
	{
		Cache::forget(self::key("wd:a_{$aid}:t_{$tid}"));
		return Cache::forget(self::key("a_{$aid}:t_{$tid}"));
	}

	public static function refresh($aid, $tid)
	{
		Cache::forget('pf:services:follower:audience:' . $aid);
		Cache::forget('pf:services:follower:audience:' . $tid);
		self::delete($tid, $aid);
		self::delete($aid, $tid);
		self::get($tid, $aid);
		return self::get($aid, $tid);
	}

	public static function forget($aid, $tid)
	{
		Cache::forget('pf:services:follower:audience:' . $aid);
		Cache::forget('pf:services:follower:audience:' . $tid);
		self::delete($tid, $aid);
		self::delete($aid, $tid);
	}

	public static function defaultRelation($tid)
	{
		return [
            'id' => (string) $tid,
            'following' => false,
            'followed_by' => false,
            'blocking' => false,
            'muting' => false,
            'muting_notifications' => null,
            'requested' => false,
            'domain_blocking' => null,
            'showing_reblogs' => null,
            'endorsed' => false
        ];
	}

	protected static function key($suffix)
	{
		return self::CACHE_KEY . $suffix;
	}

	public static function getWithDate($aid, $tid)
	{
		$res = self::get($aid, $tid);

		if(!$res || !$res['following']) {
			$res['following_since'] = null;
			return $res;
		}

		return Cache::remember(self::key("wd:a_{$aid}:t_{$tid}"), 1209600, function() use($aid, $tid, $res) {
			$tmp = Follower::whereProfileId($aid)->whereFollowingId($tid)->first();
			if(!$tmp) {
				$res['following_since'] = null;
				return $res;
			}
			$res['following_since'] = str_replace('+00:00', 'Z', $tmp->created_at->format(DATE_RFC3339_EXTENDED));
			return $res;
		});
	}
}