<?php

namespace objects;

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

class accounts_o extends db
{
    use db_object_t;
    /**
     * The phone number
     * @var object_property $phone The phone number
     */
    public object_property $phone;
    /**
     * The country code (e.g. 31 for +31)
     * @var object_property $country_code The country code (e.g. 31 for +31)
     */
    public object_property $country_code;
    /**
     * The account name
     * @var object_property $name The account name
     */
    public object_property $name;
    /**
     * The profile picture property
     * @var object_property $profile_picture The profile picture property
     */
    public object_property $profile_picture;
    /**
     * The enabled property
     * @var object_property $enabled The enabled property
     */
    public object_property $enabled;
    /**
     * The (last) seen at date
     * @var object_property $seen_at The seen at date
     */
    public object_property $seen_at;
    /**
     * The created at date
     * @var object_property $created_at The created at date
     */
    public object_property $created_at;
    /**
     * The updated at date
     * @var object_property $updated_at The updated at date
     */
    public object_property $updated_at;
    /**
     * The deleted at date
     * @var object_property $deleted_at The deleted at date
     */
    public object_property $deleted_at;

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

    /**
     * Add a new account
     * @param array $data The account data
     * @return int The account id
     * @throws Exception If the account was not created successfully
     */
    public function add(array $data): int
    {
        global /** @var db $db */
        $db;
        // Set the default values
        $data_default = [
            'phone' => 0,
            'country_code' => 45,
            'name' => '',
            'profile_picture' => null,
        ];
        // Merge the default values with the data
        $data = array_merge($data_default, $data);
        // Sanitize the input
        $data['phone'] = (int)$db->escape_string($data['phone']);
        $data['country_code'] = (int)$data['country_code'];
        $data['name'] = (string)$db->escape_string($data['name']);
        $data['profile_picture'] = $data['profile_picture'] ? (int)$data['profile_picture'] : null;
        // Add the object
        $tmp_id = self::add_object($data);
        if (!$tmp_id) {
            throw new Exception('The account was not created successfully.');
        }
        return $tmp_id;
    }

    public function getObjectProperties(): void
    {
        $this->phone = new object_property($this->table, $this->id, 'phone', 'int', false);
        $this->country_code = new object_property($this->table, $this->id, 'country_code', 'int', false);
        $this->name = new object_property($this->table, $this->id, 'name', 'string', false);
        $this->profile_picture = new object_property($this->table, $this->id, 'profile_picture', 'int', false);
        $this->enabled = new object_property($this->table, $this->id, 'enabled', 'bool', false);
        $this->seen_at = new object_property($this->table, $this->id, 'seen_at', 'datetime', false);
        $this->created_at = new object_property($this->table, $this->id, 'created_at', 'datetime', false);
        $this->updated_at = new object_property($this->table, $this->id, 'updated_at', 'datetime', false);
        $this->deleted_at = new object_property($this->table, $this->id, 'deleted_at', 'datetime', false);
    }

    /**
     * Invalidate the cached object when it is changed
     * @throws Exception If no object is selected
     */
    public function objectChanged(): void
    {
        self::requireSelected();
        // Invalidate the cache
        self::deleteCached(self::$asArrayCacheKey);
    }

    /**
     * Get the object as an array
     * @return array The object as an array
     * @throws Exception If no object is selected
     */
    public function asArray(): array
    {
        self::requireSelected();
        $cached = self::getCached(self::$asArrayCacheKey);
        // If the object is cached, return it
        if (!empty($cached)) return $cached;
        // Convert the object to an array
        $array = [
            'id' => (int)$this->id,
            'phone' => (int)$this->phone->value(),
            'country_code' => (int)$this->country_code->value(),
            'name' => (string)$this->name->value(),
            'profile_picture' => (int)$this->profile_picture->value(),
            'enabled' => (bool)$this->enabled->value(),
            'seen_at' => $this->seen_at->value(),
            'created_at' => $this->created_at->value(),
            'updated_at' => $this->updated_at->value(),
            //'deleted_at' => $this->deleted_at->value(),
        ];
        // Cache the object
        self::cache(self::$asArrayCacheKey, $array);
        self::setCachedExpiration(self::$asArrayCacheKey, self::$asArrayCacheExpiration);
        // Return the object as an array
        return $array;
    }
}