<?php

namespace forms\objects;

use Exception;
use forms\form_helper_c;
use objects\branding_o;
use objects\departments_o;
use traits\form_t;

class create_branding_f extends form_helper_c
{
    use form_t;

    /**
     * @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
    {
        // Check if the user has access to the booking
        self::restrictAccessDepartment(
            self::getSanitizedData('department_id'),
        );

        self::setDepartmentId(
            self::getSanitizedData('department_id'),
        );
        // Check if the user has access to add branding options
        self::requirePermission(
            'add_branding_option',
            'User does not have access to add branding option',
        );
        // Check if the user has access to add branding options
        $department = (new departments_o())->select(self::getDepartmentId());
        if ($department->branding->value() !== null) {
            throw new Exception('Branding already exists for this department');
        }
    }

    /**
     * @inheritDoc
     * @throws Exception If the creation of the branding object fails
     */
    public function afterSubmit(): void
    {
        // Add the branding object
        $branding = new branding_o();
        $branding->add(
            [
                'name' => (string)self::getSanitizedData('name'),
                'description' => (string)self::getSanitizedData('description'),
                'cvr' => (int)self::getSanitizedData('cvr'),
            ],
        );
        // Set the departments branding id to the newly created branding id
        $department = (new departments_o())->select(self::getDepartmentId());
        $department->branding->set((int)$branding->id);
        $department->objectChanged();
    }

    /**
     * @inheritDoc
     */
    public function setup(): void
    {
        self::setFormIdentifier('CREATE_BRANDING');
        self::setFormName('Opret brand');
        self::setFormDescription('Du kan oprette et unikt brand til afdelingen.');
        self::setSubmitButtonText('Opret brand');
        // Set the form fields
        self::defineInputFieldsAdvanced([
            'department_id' => [
                'description' => 'Vælg den afdeling, som brandet skal tilknyttes.',
                'required' => true,
                'placeholder' => 'Vælg afdeling',
                'label' => 'Afdeling',
                'help' => 'Dette er afdelingen, som brandet skal tilknyttes.',
                'error' => 'Du skal vælge en afdeling.',
                'validation_method' => 'validateDepartmentId',
            ],
            'name' => [
                'description' => 'Dette navn bruges til at identificere brandet. Det ville være bedst at vælge et navn, der er let at huske og relaterer til brandet.',
                'required' => true,
                'placeholder' => 'Indtast brand navn',
                'label' => 'Brand navn',
                'help' => 'Dette er brand navnet, der bruges til at identificere brandet.',
                'error' => 'Du skal indtaste et gyldigt brand navn.',
                'validation_method' => 'validateString',
            ],
            'description' => [
                'description' => 'En beskrivelse af brandet, der forklarer, hvad det handler om. Dette kan være nyttigt for andre brugere.',
                'required' => true,
                'placeholder' => 'Indtast brand beskrivelse',
                'label' => 'Brand beskrivelse',
                'help' => 'Dette er brand beskrivelsen, der bruges til at forklare brandet.',
                'error' => 'Du skal indtaste en gyldig brand beskrivelse.',
                'validation_method' => 'validateString',
                'default' => '',
            ],
            'cvr' => [
                'description' => 'CVR nummeret er et unikt identifikationsnummer for virksomheder i Danmark. Det er vigtigt at indtaste det korrekte CVR nummer, da det bruges til at identificere brandet.',
                'required' => true,
                'placeholder' => 'Indtast brand CVR nummer',
                'label' => 'Brand CVR nummer',
                'help' => 'Dette er brand CVR nummeret, der bruges til at identificere brandet.',
                'error' => 'Du skal indtaste et gyldigt brand CVR nummer.',
                'validation_method' => 'validateInt',
            ],
        ]);

    }
}