<?php

namespace forms\objects;

use classes\email;
use forms\form_helper_c;
use objects\bookings_o;
use objects\departments_o;
use objects\users_o;
use Psr\Http\Client\ClientExceptionInterface;
use traits\form_t;

class book_wash_f extends form_helper_c
{
    use form_t;
    public ?bookings_o $booking_object = null;

    /**
     * @inheritDoc
     */
    public function sanitize(): void
    {
        foreach ( $this->form_unsanitized_data as $key => $value ) {
            // Sanitize the input TODO: Implement the sanitization logic
            $this->form_unsanitized_data[$key] = $value;
        }
        // Set the sanitized data
        $this->form_sanitized_data = $this->form_unsanitized_data;
    }

    /**
     * @inheritDoc
     */
    public function validateInput(): void
    {

    }

    /**
     * @inheritDoc
     */
    public function beforeSave(): void
    {
        throw new \Exception('Deprecated: Please refresh the page, and use the new booking page instead.');
        // Set the department id to the department id of the user
        self::setDepartmentId(self::getSanitizedData('department_id'));
        // Set the customer number to the customer number of the user
        self::setCustomerNumber(self::getSanitizedData('customer_number'));
    }

    /**
     * @inheritDoc
     * @throws \Exception
     * @throws ClientExceptionInterface
     */
    public function afterSubmit(): void
    {
        $email = new email();
        // Get the user from the customer number
        $user = (new users_o())->getUserByCustomerNumber(self::getSanitizedData('customer_number'));
        // Get the department name from the department id
        $department = (new departments_o())->selectId((int)self::getSanitizedData('department_id'));
        $department->getObjectProperties();
        // Get the bookings_new object
        throw new \Exception('Deprecated: Use bookings_o instead of bookings_new_o');
        $bookings = new bookings_o();
        // Check if the wash type contains the interior wash
        $wants_wash_certificate = (bool)self::getSanitizedData('wants_wash_certificate');
        if (in_array(3, self::getSanitizedData('wash_type'))) {
            if ($wants_wash_certificate) {
                $wash_certificate_email = self::getSanitizedData('wants_wash_certificate_email');
            } else {
                $wash_certificate_email = '';
            }
        } else {
            $wash_certificate_email = '';
            $wants_wash_certificate = false;
        }
        // Create a new booking
        $bookings->add(
            self::getCustomerNumber(),
            self::getFormIdentifier(),
            self::getSanitizedData('contact_email'),
            self::getSanitizedData('reference'),
            strtoupper(self::getSanitizedData('registration_number_tractor')),
            strtoupper(self::getSanitizedData('registration_number_trailer')),
            $wash_certificate_email ?? '',
            self::getSanitizedData('date'),
            $department->id,
            (bool)self::getSanitizedData('wants_pickup'),
            self::getSanitizedData('notes'),
            ($wants_wash_certificate ? 'pending' : 'cancelled'),
            '',
            'pending',
            self::getSanitizedData('wash_type'),
        );
        // Ad
        // Validate the booking actually exists
        if (!$bookings->exists()) {
            throw new \Exception('Booking could not be created');
        }
        // Send the booking confirmation email
        $email->sendBookingConfirmationEmail(
            $bookings->id,
        );
        $this->booking_object = $bookings;
        // TODO: Implement afterSubmit() method.
    }

    /**
     * @inheritDoc
     */
    public function setup(): void
    {
        self::setFormIdentifier('BOOK_WASH');
        self::setFormName('Book vask med reference');
        self::setFormDescription('
            Book en vask med reference. Dette er en formular, der bruges til at booke en vask med reference. 
            Det er vigtigt at udfylde alle felter korrekt for at sikre, at vasken bliver booket korrekt.
            ');
        self::setSubmitButtonText('Book vask');
        // Set the form fields
        self::defineInputFieldsAdvanced([
            'department_id' => [
                'description' => 'Den lokation / vaskehal, hvor vasken skal finde sted.',
                'required' => true,
                'placeholder' => null,
                'label' => 'Vælg lokation',
                'help' => 'Vælg den lokation, hvor vasken skal finde sted.',
                'error' => 'Du skal vælge en afdeling.',
                'validation_method' => 'validateInt',
                'options' => self::getDepartmentOptions(['bookingsystem_enabled']),
            ],
            'wash_type' => [
                'description' => 'Vasketype er den type vask, der skal udføres på køretøjet. Dette kan være en indvendig vask, udvendig vask eller begge dele.',
                'required' => true,
                'placeholder' => null,
                'label' => 'Vaskeydelser',
                'help' => 'Vælg de vaskeydelser, du ønsker.',
                'error' => 'Du skal vælge en vaskeydelser.',
                'validation_method' => 'validateInt',
                'options' => self::getWashTypes(),
                'allow_multiple' => true,
            ],
            'customer_number' => [
                'description' => 'Et kunde nummer, er et unikt nummer, som er tildelt til hver kunde. Som standard er det telefonnummeret indtastet ved oprettelse af kunden.',
                'required' => true,
                'placeholder' => 'Indtast dit kunde nummer',
                'label' => 'Kunde nummer',
                'help' => 'Dit kunde nummer, som du har fået tildelt af os.',
                'error' => 'Du skal indtaste et gyldigt kunde nummer.',
                'validation_method' => 'validateCustomerNumber',
            ],
            'contact_email' => [
                'description' => 'Det er vigtigt at indtaste en gyldig email adresse, da vi sender en bekræftelse til denne adresse.',
                'required' => true,
                'placeholder' => 'Indtast din email adresse',
                'label' => 'Email adresse',
                'help' => 'Vi sender en bekræftelse til denne email adresse.',
                'error' => 'Du skal indtaste en gyldig email adresse.',
                'validation_method' => 'validateEmail',
                'allow_auto_fill' => true,
            ],
            'reference' => [
                'description' => 'Det er muligt at indtaste et reference nummer, hvis det er relevant for dig. Dette nummer kan være nyttigt til at identificere din booking.',
                'required' => false,
                'placeholder' => 'Indtast et reference nummer (hvis relevant)',
                'label' => 'Reference nr.',
                'help' => 'Dette nummer tilføjes til din booking som reference.',
                'error' => 'Du skal indtaste et gyldigt reference nummer.',
                'validation_method' => 'validateString',
                'default' => '',
            ],
            'registration_number_tractor' => [
                'description' => 'Nummerpladen på den trækkende enhed, som er det køretøj, der trækker traileren.',
                'required' => true,
                'placeholder' => 'Indtast registreringsnummeret på den trækkende enhed',
                'label' => 'Reg 1',
                'help' => 'Dette er nummerpladen på den trækkende enhed.',
                'error' => 'Du skal indtaste et gyldigt registreringsnummer.',
                'validation_method' => 'validateRegistrationNumber',
            ],
            'registration_number_trailer' => [
                'description' => 'Nummerpladen på traileren, som er det køretøj, der bliver trukket af den trækkende enhed.',
                'required' => true,
                'placeholder' => 'Indtast registreringsnummeret på traileren',
                'label' => 'Reg 2',
                'help' => 'Dette er nummerpladen på traileren.',
                'error' => 'Du skal indtaste et gyldigt registreringsnummer.',
                'validation_method' => 'validateRegistrationNumber',
            ],
            'wants_wash_certificate' => [
                'description' => 'En vaskecertifikat er et dokument, der bekræfter, at køretøjet er blevet vasket og rengjort.',
                'required' => false,
                'label' => 'Ønsker vaskecertifikat',
                'help' => 'Hvis du ønsker et vaskecertifikat, skal du markere denne boks.',
                'error' => null,
                'validation_method' => 'validateBoolean',
                'default' => true,
            ],
            'wants_wash_certificate_email' => [
                'description' => 'Vaskecertifikatet sendes til den email adresse, der er angivet her. Det er vigtigt at indtaste en gyldig email adresse.',
                'required' => false,
                'placeholder' => 'Indtast email adresse til vaskecertifikat',
                'label' => 'Email adresse til vaskecertifikat',
                'help' => 'Vaskecertifikatet sendes til denne email adresse.',
                'error' => 'Du skal indtaste en gyldig email adresse.',
                'validation_method' => 'validateEmail',
                'display_if' => 'wants_wash_certificate',
                'display_if_value' => true,
                'required_if_display' => true,
                'hidden_value' => '',
                'default' => null,
                'allow_auto_fill' => true,
            ],
            'date' => [
                'description' => 'Datoen for vasken, som er den dato, hvor vasken skal finde sted.',
                'required' => true,
                'placeholder' => null,
                'label' => 'Dato',
                'help' => 'Hvornår skal vasken finde sted?',
                'error' => 'Du skal indtaste en gyldig dato.',
                'validation_method' => 'validateDate',
                'default' => date('Y-m-d'),
            ],
            'wants_pickup' => [
                'description' => 'Pickup er en service, hvor vi henter køretøjet og bringer det tilbage efter vasken.',
                'required' => false,
                'label' => 'Ønsker afhentning',
                'help' => 'Hvis du ønsker afhentning af køretøjet, skal du markere denne boks.',
                'error' => null,
                'validation_method' => 'validateBoolean',
            ],
            'notes' => [
                'description' => 'Dette er et felt, hvor du kan tilføje eventuelle noter eller kommentarer, der er relevante for vasken. Som f.eks. særlige instruktioner eller ønsker.',
                'required' => false,
                'placeholder' => 'Indtast eventuelle noter eller kommentarer',
                'label' => 'Noter',
                'help' => 'Skriv her eventuelle noter eller kommentarer, der er relevante for vasken.',
                'error' => null,
                'validation_method' => 'validateString',
                'default' => '',
                'allow_auto_fill' => true,
            ],
        ]);

    }

    private static function getWashTypes(): array
    {
        return [
            1 => 'Udvendig sættevognstræk ( Trækker / trailer )',
            2 => 'Udvendigt trailer vask',
            3 => 'Indvendig trailer vask',
        ];
    }
}