<?php

namespace App\Classes;

use App\Jobs\DispatchWebhookJob;
use App\WebhookEvent;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\DB;

class WebhookService
{

    //Subscriber é a entidade que representa um cliente que deseja receber notificações sobre eventos específicos. Ele contém informações como o ID do cliente, os eventos aos quais está inscrito, a URL de callback para onde as notificações devem ser enviadas e um segredo para autenticação.
    public function createSubscriber($user_client_id, $events, $callback_url)
    {
        $subscription = DB::table('webhook_subcribers')
            ->insert([
                'user_client_id' => $user_client_id,
                'events' => json_encode($events),
                'callback_url' => $callback_url,
                'webhook_secret' => 'whsec_' . Str::random(32)
            ]);

        return $subscription;
    }

    //Evento é tudo que acontece na aplicação, como criação de pagamento, usuário, atualização de pedido, etc.
    public function createEvent(string $type, array $data)
    {
        $eventId = 'evt_' . Str::uuid();

        $event = WebhookEvent::create([
            'event_uuid' => $eventId,
            'type' => $type,
            'payload' => json_encode($data)
        ]);

        $this->dispatch($event);

        return $event;
    }

    //WebhookDelivery é a entidade que representa a tentativa de entrega de uma notificação para um assinante específico. Ele contém informações como o ID do evento, o ID do assinante, o status da entrega (sucesso ou falha), o código de resposta HTTP recebido do endpoint do assinante e o payload enviado.
    protected function dispatch($event)
    {
        $subscriptions = DB::table('webhook_subcribers')
            ->where('is_active', true)
            ->whereJsonContains('events', $event->type)
            ->get();

        // foreach ($subscriptions as $sub) DispatchWebhookJob::dispatch($event->id, $sub->id);
        DispatchWebhookJob::dispatch(1, 1);
    }
}
