<?php

namespace App\Observers;

use App\UserFilter;
use App\Services\UserFilterService;
use App\Jobs\HomeFeedPipeline\FeedFollowPipeline;
use App\Jobs\HomeFeedPipeline\FeedUnfollowPipeline;

class UserFilterObserver
{
    /**
     * Handle events after all transactions are committed.
     *
     * @var bool
     */
    public $afterCommit = true;

	/**
	 * Handle the user filter "created" event.
	 *
	 * @param  \App\UserFilter  $userFilter
	 * @return void
	 */
	public function created(UserFilter $userFilter)
	{
		$this->filterCreate($userFilter);
	}

	/**
	 * Handle the user filter "updated" event.
	 *
	 * @param  \App\UserFilter  $userFilter
	 * @return void
	 */
	public function updated(UserFilter $userFilter)
	{
		$this->filterCreate($userFilter);
	}

	/**
	 * Handle the user filter "deleted" event.
	 *
	 * @param  \App\UserFilter  $userFilter
	 * @return void
	 */
	public function deleted(UserFilter $userFilter)
	{
		$this->filterDelete($userFilter);
	}

	/**
	 * Handle the user filter "restored" event.
	 *
	 * @param  \App\UserFilter  $userFilter
	 * @return void
	 */
	public function restored(UserFilter $userFilter)
	{
		$this->filterCreate($userFilter);
	}

	/**
	 * Handle the user filter "force deleted" event.
	 *
	 * @param  \App\UserFilter  $userFilter
	 * @return void
	 */
	public function forceDeleted(UserFilter $userFilter)
	{
		$this->filterDelete($userFilter);
	}

	protected function filterCreate(UserFilter $userFilter)
	{
		if($userFilter->filterable_type !== 'App\Profile') {
			return;
		}

		switch ($userFilter->filter_type) {
			case 'mute':
				UserFilterService::mute($userFilter->user_id, $userFilter->filterable_id);
				FeedUnfollowPipeline::dispatch($userFilter->user_id, $userFilter->filterable_id)->onQueue('feed');
				break;
				
			case 'block':
				UserFilterService::block($userFilter->user_id, $userFilter->filterable_id);
				FeedUnfollowPipeline::dispatch($userFilter->user_id, $userFilter->filterable_id)->onQueue('feed');
				break;
		}
	}


	protected function filterDelete(UserFilter $userFilter)
	{
		if($userFilter->filterable_type !== 'App\Profile') {
			return;
		}

		switch ($userFilter->filter_type) {
			case 'mute':
				UserFilterService::unmute($userFilter->user_id, $userFilter->filterable_id);
				FeedFollowPipeline::dispatch($userFilter->user_id, $userFilter->filterable_id)->onQueue('feed');
				break;
				
			case 'block':
				UserFilterService::unblock($userFilter->user_id, $userFilter->filterable_id);
				FeedFollowPipeline::dispatch($userFilter->user_id, $userFilter->filterable_id)->onQueue('feed');
				break;
		}
	}
}