<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use App\Follower;
use App\Notification;
use App\Profile;
use App\UserFilter;
use App\Services\AccountService;
use App\Services\FollowerService;
use App\Services\NotificationService;
use App\Services\RelationshipService;
use App\Services\UserFilterService;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        UserFilter::whereFilterType('block')
        ->whereFilterableType('App\Profile')
        ->chunk(10, function($filters) {
        	foreach($filters as $filter) {
        		$actor = Profile::whereNull('status')->find($filter->user_id);
        		if(!$actor) {
        			continue;
        		}
        		$target = Profile::whereNull('status')->find($filter->filterable_id);
        		if(!$target) {
        			continue;
        		}

				$followed = Follower::whereProfileId($target->id)->whereFollowingId($actor->id)->first();
				if($followed) {
					$followed->delete();
					$target->following_count = Follower::whereProfileId($target->id)->count();
					$target->save();
					$actor->followers_count = Follower::whereFollowingId($actor->id)->count();
					$actor->save();
					FollowerService::remove($target->id, $actor->id);
					AccountService::del($actor->id);
					AccountService::del($target->id);
				}

				$following = Follower::whereProfileId($actor->id)->whereFollowingId($target->id)->first();
				if($following) {
					$following->delete();
					$actor->followers_count = Follower::whereFollowingId($target->id)->count();
					$actor->save();
					$target->following_count = Follower::whereProfileId($actor->id)->count();
					$target->save();
					FollowerService::remove($actor->id, $target->id);
					AccountService::del($actor->id);
					AccountService::del($target->id);
				}

				Notification::whereProfileId($actor->id)
					->whereActorId($target->id)
					->get()
					->map(function($n) use($actor) {
						NotificationService::del($actor->id, $n['id']);
						$n->forceDelete();
				});

				UserFilterService::block($actor->id, $target->id);
				RelationshipService::refresh($actor->id, $target->id);
        	}
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        //
    }
};