<?php

namespace App\Services;

use App\Util\ActivityPub\Helpers;
use App\Util\ActivityPub\HttpSignature;

class ActivityPubDeliveryService
{
    public $sender;

    public $to;

    public $payload;

    public static function queue()
    {
        return new self;
    }

    public function from($profile)
    {
        $this->sender = $profile;

        return $this;
    }

    public function to(string $url)
    {
        $this->to = $url;

        return $this;
    }

    public function payload($payload)
    {
        $this->payload = $payload;

        return $this;
    }

    public function send()
    {
        return $this->queueDelivery();
    }

    protected function queueDelivery()
    {
        abort_if(! $this->sender || ! $this->to || ! $this->payload, 400);
        abort_if(! Helpers::validateUrl($this->to), 400);
        abort_if($this->sender->domain != null || $this->sender->status != null, 400);

        if (config('app.env') !== 'production') {
            \Log::info('Skipped delivery to '.$this->to);

            return;
        }
        $body = $this->payload;
        $payload = json_encode($body);
        $version = config('pixelfed.version');
        $appUrl = config('app.url');
        $headers = HttpSignature::sign($this->sender, $this->to, $body, [
            'Content-Type' => 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"',
            'User-Agent' => "(Pixelfed/{$version}; +{$appUrl})",
        ]);

        $ch = curl_init($this->to);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_exec($ch);
    }
}
