<?php

namespace App\Mail;

use App\Mail\Concerns\RidesALane;
use App\Mail\Concerns\SendsFromMailbox;
use App\Models\Operator;
use App\Services\Mail\MailCatalogue;
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\Queue\SerializesModels;

/**
 * „Sie wurden in die CluPilot-Konsole eingeladen."
 *
 * Diese Mail trägt AUSDRÜCKLICH kein Passwort. Vorher erzeugte die Konsole
 * eines und zeigte es dem Inhaber einmal an, damit er es „sicher weitergibt" —
 * für einen Zugang, der die ganze Flotte und jede Kundeninstanz verwaltet. Ein
 * Passwort, das zwei Menschen kennen, gehört keinem von beiden; und was einmal
 * durch einen Chat gegangen ist, steht dort für immer.
 *
 * Sie trägt deshalb nur zweierlei: den Link, an dem der Eingeladene sein
 * eigenes Passwort vergibt, und den NAMEN dessen, der eingeladen hat. Der Name
 * ist kein Beiwerk: eine Mail, die einem Menschen einen Zugang zu einer Konsole
 * anbietet, ist von aussen nicht von einem Phishing-Versuch zu unterscheiden —
 * ausser dadurch, dass darin steht, wen er gerade danach fragen kann.
 */
class OperatorInvitationMail extends Mailable implements ShouldQueue
{
    use Queueable, RidesALane, SendsFromMailbox, SerializesModels;

    public function __construct(
        public Operator $operator,
        public string $invitedBy,
        public string $url,
        public int $hours,
    ) {
        $this->mailer(MailCatalogue::mailer('operator-invitation'));
    }

    /**
     * Wie lange der Link in dieser Mail gilt, in Stunden.
     *
     * Aus der Broker-Einstellung gelesen statt danebengeschrieben: die Zahl
     * steht im Text der Mail, im Hinweis unter dem Einladen-Formular und in der
     * Vorschau — drei Orte mit derselben Zahl sind zwei Orte, an denen sie
     * falsch wird. Die Frist selbst ist in config/auth.php begründet.
     */
    public static function validHours(): int
    {
        return (int) round(((int) config('auth.passwords.operators.expire', 60)) / 60);
    }

    public function envelope(): Envelope
    {
        return $this->mailboxEnvelope(MailPurpose::SYSTEM, __('operator_invitation.subject'), 'operator-invitation');
    }

    public function content(): Content
    {
        return new Content(view: 'mail.operator-invitation', with: [
            'name' => $this->operator->name,
            'invitedBy' => $this->invitedBy,
            'url' => $this->url,
            'hours' => $this->hours,
        ]);
    }
}
