<?php

namespace App\Observers;

use App\Status;
use App\Services\ProfileStatusService;
use Cache;
use App\Models\ImportPost;
use App\Services\ImportService;
use App\Jobs\HomeFeedPipeline\FeedRemovePipeline;
use App\Jobs\HomeFeedPipeline\FeedRemoveRemotePipeline;

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

    /**
     * Handle the Status "created" event.
     *
     * @param  \App\Status  $status
     * @return void
     */
    public function created(Status $status)
    {
        //
    }

    /**
     * Handle the Status "updated" event.
     *
     * @param  \App\Status  $status
     * @return void
     */
    public function updated(Status $status)
    {
        if(!in_array($status->scope, ['public', 'unlisted', 'private'])) {
            return;
        }

        if(config('instance.timeline.home.cached')) {
            Cache::forget('pf:timelines:home:' . $status->profile_id);
        }

        if(in_array($status->scope, ['public', 'unlisted']) && in_array($status->type, ['photo', 'photo:album', 'video'])) {
            ProfileStatusService::add($status->profile_id, $status->id);
        }
    }

    /**
     * Handle the Status "deleted" event.
     *
     * @param  \App\Status  $status
     * @return void
     */
    public function deleted(Status $status)
    {
        if(!in_array($status->scope, ['public', 'unlisted', 'private'])) {
            return;
        }

        if(config('instance.timeline.home.cached')) {
            Cache::forget('pf:timelines:home:' . $status->profile_id);
        }

        ProfileStatusService::delete($status->profile_id, $status->id);

        if($status->uri == null) {
            ImportPost::whereProfileId($status->profile_id)->whereStatusId($status->id)->delete();
            ImportService::clearImportedFiles($status->profile_id);
        }

        if(config('exp.cached_home_timeline')) {
        	if($status->uri) {
        		FeedRemoveRemotePipeline::dispatch($status->id, $status->profile_id)->onQueue('feed');
        	} else {
        		FeedRemovePipeline::dispatch($status->id, $status->profile_id)->onQueue('feed');
        	}
        }
    }

    /**
     * Handle the Status "restored" event.
     *
     * @param  \App\Status  $status
     * @return void
     */
    public function restored(Status $status)
    {
        //
    }

    /**
     * Handle the Status "force deleted" event.
     *
     * @param  \App\Status  $status
     * @return void
     */
    public function forceDeleted(Status $status)
    {
        //
    }
}