<?php

namespace App\Mail;

use App\Models\Form;
use App\Models\FormResponse;
use App\Models\Member;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\URL;

class FormResponseConfirmation extends Mailable
{
    use Queueable, SerializesModels;

    public $form;
    public $recipientEmail;
    public $submissionData;
    public $cancelUrl;
    public $contactEmail;

    public function __construct(Form $form, FormResponse $formResponse, string $recipientEmail, array $submissionData)
    {
        $this->form = $form;
        $this->recipientEmail = $recipientEmail;
        $this->submissionData = $this->resolveDisplayValues($form, $submissionData);
        $this->contactEmail = $form->resolveContactEmail();

        $relativePath = URL::signedRoute(
            'form-response.cancel',
            ['formResponse' => $formResponse->id],
            null,   // no expiration
            false   // relative => signature over path only
        );
        $this->cancelUrl = rtrim(config('app.url'), '/') . $relativePath;
    }

    private function resolveDisplayValues(Form $form, array $data): array
    {
        foreach ($form->formSections as $section) {
            foreach ($section->formFields as $field) {
                if ($field->field_type !== 'members') {
                    continue;
                }

                $key = 'field_' . $field->form_field_id;

                if (empty($data[$key])) {
                    continue;
                }

                $member = Member::full()
                    ->select('members.*', 'member_languages.*')
                    ->where('members.id', $data[$key])
                    ->first();

                if ($member) {
                    $data[$key] = $member->title;
                }
            }
        }

        return $data;
    }

    public function build()
    {
        return $this->from(config('mail.from.address'), config('mail.from.name'))
            ->subject(trans('emails.confirmation_subject', ['event' => $this->form->title]))
            ->view('emails.form-response-confirmation');
    }
}
