<?php

namespace App\Observers;

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

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

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

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

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

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

    /**
     * Handle the user filter "force deleted" event.
     *
     * @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;
        }
    }
}
