<?php

namespace App\Mail;

use App\Models\Monitoring\ApiBlock;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;

/**
 * Aviso de que algo ha pasado a BLOQUEADO en la API.
 *
 * Se manda una vez por bloqueo, en la transición: mientras el bloqueo siga abierto no
 * se repite, y si alguien lo libera y vuelve a pasar, se avisa otra vez. Ver
 * `App\Services\System\BlockNotifier`.
 *
 * No confundir con `ApiRateLimitAlert`, que avisa de que una IP se **acerca** al tope
 * y sí es un aviso repetible con enfriamiento.
 */
class ApiBlockAlert extends Mailable
{
    use Queueable;
    use SerializesModels;

    public function __construct(public ApiBlock $bloqueo)
    {
    }

    public function envelope(): Envelope
    {
        // El asunto lleva el sujeto porque es lo que se lee en la lista del correo sin
        // abrirlo, y es lo que permite decidir si corre prisa.
        return new Envelope(
            subject: '[Manager ' . config('app.env') . '] Bloqueo en la API — ' . $this->bloqueo->sujeto_texto,
        );
    }

    public function content(): Content
    {
        return new Content(
            markdown: 'emails.api-block-alert',
            with: [
                'bloqueo' => $this->bloqueo,
                'urlBloqueos' => route('configurations.manager.index'),
                'urlLogs' => $this->bloqueo->ip
                    ? route('api-logs.index', ['ip' => $this->bloqueo->ip])
                    : route('api-logs.index'),
            ],
        );
    }
}
