<?php

namespace App\Jobs\ProfilePipeline;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use App\Avatar;
use App\Profile;
use App\Util\ActivityPub\Helpers;
use Cache;
use Purify;
use App\Jobs\AvatarPipeline\RemoteAvatarFetchFromUrl;
use App\Util\Lexer\Autolink;

class HandleUpdateActivity implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $payload;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($payload)
    {
        $this->payload = $payload;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle(): void
    {
        $payload = $this->payload;

        if(empty($payload) || !isset($payload['actor'])) {
            return;
        }

        $profile = Profile::whereRemoteUrl($payload['actor'])->first();

        if(!$profile || $profile->domain === null || $profile->private_key) {
            return;
        }

        if($profile->sharedInbox == null || $profile->sharedInbox != $payload['object']['endpoints']['sharedInbox']) {
            $profile->sharedInbox = $payload['object']['endpoints']['sharedInbox'];
        }

        if($profile->public_key !== $payload['object']['publicKey']['publicKeyPem']) {
            $profile->public_key = $payload['object']['publicKey']['publicKeyPem'];
        }

        if($profile->bio !== $payload['object']['summary']) {
            $len = strlen(strip_tags($payload['object']['summary']));
            if($len) {
                if($len > 500) {
                    $updated = strip_tags($payload['object']['summary']);
                    $updated = substr($updated, 0, config('pixelfed.max_bio_length'));
                    $profile->bio = Autolink::create()->autolink($updated);
                } else {
                    $profile->bio = Purify::clean($payload['object']['summary']);
                }
            } else {
                $profile->bio = null;
            }
        }

        if($profile->name !== $payload['object']['name']) {
            $profile->name = Purify::clean(substr($payload['object']['name'], 0, config('pixelfed.max_name_length')));
        }

        if($profile->isDirty()) {
            $profile->save();
        }

        if(isset($payload['object']['icon']) && isset($payload['object']['icon']['url'])) {
            RemoteAvatarFetchFromUrl::dispatch($profile, $payload['object']['icon']['url'])->onQueue('low');
        } else {
            $profile->avatar->update(['remote_url' => null]);
            Cache::forget('avatar:' . $profile->id);
        }

        return;
    }
}