<?php

namespace objects;

use classes\db;
use classes\object_property;
use Exception;
use traits\db_object_t;

class branding_o extends db
{
    use db_object_t;

    public object_property $name;
    public object_property $description;
    public object_property $cvr;
    public object_property $address;
    public object_property $phone_country_code;
    public object_property $phone;
    public object_property $email;
    public object_property $website;
    public object_property $banner;
    public object_property $logo;
    public object_property $favicon;
    public object_property $signature;


    public function structure(): void
    {
        $this->setTable('branding');
    }

    /**
     * Add a branding object
     * @param array $data The additional data of the branding (e.g. ["key" => "value"])
     * @return void
     * @throws Exception If the object was not created successfully
     */
    public function add(
        array $data,
    ): void
    {
        global /** @var db $db */
        $db;
        // Define the default values
        $default_values = [
            'name' => null,
            'description' => null,
            'cvr' => null,
            'address' => null,
            'phone_country_code' => null,
            'phone' => null,
            'email' => null,
            'website' => null,
            'banner' => null,
            'logo' => null,
            'favicon' => null,
            'signature' => null,
        ];
        // Sanitize the input
        $sanitized_data = [];
        foreach ( $data as $key => $value ) {
            // Sanitize the input
            if (array_key_exists($key, $default_values)) {
                // If the value is null, skip it
                if (is_null($value)) {
                    continue;
                } elseif (is_string($value)) {
                    $sanitized_data[$key] = $db->escape_string($value);
                } elseif (is_int($value)) {
                    $sanitized_data[$key] = (int)$value;
                } elseif (is_array($value)) {
                    $sanitized_data[$key] = json_encode($value);
                } else {
                    throw new Exception("Invalid value type for key: $key");
                }
            } else {
                throw new Exception("Invalid key: $key");
            }
        }
        // Define the actual object values
        $new_object = array_merge(
            $default_values,
            $sanitized_data
        );
        // Remove null values
        $new_object = array_filter($new_object, function ($value) {
            return !is_null($value);
        });
        // Add the object to the database
        $new_id = self::add_object($new_object);
        self::select($new_id);
    }

    public function getObjectProperties(): void
    {
        $this->name = new object_property($this->table, $this->id, 'name', 'string', false);
        $this->description = new object_property($this->table, $this->id, 'description', 'string', false);
        $this->cvr = new object_property($this->table, $this->id, 'cvr', 'int', false);
        $this->address = new object_property($this->table, $this->id, 'address', 'string', false);
        $this->phone_country_code = new object_property($this->table, $this->id, 'phone_country_code', 'int', false);
        $this->phone = new object_property($this->table, $this->id, 'phone', 'int', false);
        $this->email = new object_property($this->table, $this->id, 'email', 'string', false);
        $this->website = new object_property($this->table, $this->id, 'website', 'string', false);
        $this->banner = new object_property($this->table, $this->id, 'banner', 'string', false);
        $this->logo = new object_property($this->table, $this->id, 'logo', 'string', false);
        $this->favicon = new object_property($this->table, $this->id, 'favicon', 'string', false);
        $this->signature = new object_property($this->table, $this->id, 'signature', 'string', false);
    }

    public function objectChanged(): void
    {
        //TODO: Add cache invalidation
    }


    public function asArray(): array
    {
        return [
            'id' => (int)$this->id,
            'name' => $this->name->value(),
            'description' => $this->description->value(),
            'cvr' => $this->cvr->value(),
            'address' => $this->address->value(),
            'phone_country_code' => $this->phone_country_code->value(),
            'phone' => $this->phone->value(),
            'email' => $this->email->value(),
            'website' => $this->website->value(),
            'banner' => $this->banner->value(),
            'logo' => $this->logo->value(),
            'favicon' => $this->favicon->value(),
            'signature' => $this->signature->value(),
        ];
    }

}