<?php

namespace App\Jobs\ProfilePipeline;

use App\Jobs\AvatarPipeline\RemoteAvatarFetchFromUrl;
use App\Profile;
use App\Services\SanitizeService;
use App\Util\Lexer\Autolink;
use Cache;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;
use Purify;

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.
     */
    public function handle(): void
    {
        $payload = $this->payload;

        // Verify payload exists
        if (! $payload) {
            Log::info('HandleUpdateActivity: Payload not provided, skipping job');

            return;
        }

        if (! $payload || ! isset($payload['actor'])) {
            Log::info('HandleUpdateActivity: Invalid payload or missing actor, skipping job');

            return;
        }

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

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

        $sharedInbox = isset($payload['object']['endpoints']['sharedInbox']) ? $payload['object']['endpoints']['sharedInbox'] : null;
        if ($profile->sharedInbox !== $sharedInbox) {
            $profile->sharedInbox = $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 = app(SanitizeService::class)->html($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);
        }

    }
}
