<?php

namespace App\Mail;

use App\Mail\Concerns\SendsFromMailbox;
use App\Models\Customer;
use App\Models\MaintenanceWindow;
use App\Services\Mail\MailPurpose;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Mail\Mailables\Headers;
use Illuminate\Queue\SerializesModels;

class MaintenanceAnnouncementMail extends Mailable implements ShouldQueue
{
    use Queueable, SendsFromMailbox, SerializesModels;

    /** The ledger row this mail confirms once actually delivered. */
    public ?int $notificationId = null;

    public function __construct(
        public MaintenanceWindow $window,
        public Customer $customer,
    ) {
        // Names the mailer, which is all that is serialised into the queue —
        // the credentials behind it are resolved when the worker sends.
        $this->mailer('cp_'.MailPurpose::MAINTENANCE);
    }

    public function headers(): Headers
    {
        return new Headers(text: $this->notificationId ? ['X-CP-Notification' => (string) $this->notificationId] : []);
    }

    public function envelope(): Envelope
    {
        return $this->mailboxEnvelope(
            MailPurpose::MAINTENANCE,
            __('maintenance.mail_subject', ['title' => $this->window->title]),
        );
    }

    public function content(): Content
    {
        return new Content(view: 'mail.maintenance-announcement', with: [
            'title' => $this->window->title,
            'description' => $this->window->public_description,
            'startsAt' => $this->window->starts_at,
            'endsAt' => $this->window->ends_at,
            'name' => $this->customer->name,
        ]);
    }
}
