<?php

namespace App\Mail;

use App\Models\Order;
use App\Services\OrderConfirmationQrImageService;
use App\Services\OrderPaymentService;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;

/**
 * Correo transaccional enviado al comprador cuando el pago de la orden se completa con éxito.
 *
 * Contenido principal:
 * - Resumen del evento y entradas.
 * - Un código QR por asistente (imágenes generadas por {@see OrderConfirmationQrImageService}).
 *
 * Disparado desde:
 * - {@see OrderPaymentService::completeOrder()} al marcar la orden como pagada.
 * - Reenvío manual desde el panel de pagos en algunos casos.
 *
 * @todo Adjuntar PDF u otro formato si el negocio lo exige además del HTML.
 */
class OrderConfirmationMail extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * @param  Order  $order  Orden con relaciones cargables (attendees, etc.); se serializa si la cola está activa.
     */
    public function __construct(
        public Order $order,
    ) {}

    /**
     * Metadatos SMTP: asunto visible en la bandeja del cliente.
     */
    public function envelope(): Envelope
    {
        return new Envelope(
            subject: __('Confirmación de Compra - :app', ['app' => config('app.name')]),
        );
    }

    /**
     * Vista Blade y variables pasadas al template.
     *
     * `qrUrls`: mapa attendee id → URL absoluta del PNG (no inline base64).
     */
    public function content(): Content
    {
        return new Content(
            view: 'emails.order-confirmation',
            with: [
                'event' => $this->order->attendees->first()?->ticketType?->event,
                'qrUrls' => $this->generateQrImageUrls(),
            ],
        );
    }

    /**
     * Delega la generación de QR en disco + URLs al servicio dedicado.
     *
     * @return array<int, string> attendee id => URL pública del PNG
     */
    private function generateQrImageUrls(): array
    {
        return app(OrderConfirmationQrImageService::class)->publicUrlsForOrder($this->order);
    }
}
