<?php

namespace goodboyalex\php_components_pack\models;

use goodboyalex\php_components_pack\enums\MessageType;
use goodboyalex\php_components_pack\interfaces\ISerializable;

/**
 * Класс сообщения состояния.
 *
 * @author Александр Бабаев
 * @package php_components_pack
 * @version 1.0
 * @since 1.0
 */
final class ActionStateMessageModel implements ISerializable
{
    /**
     * @var MessageType $MessageType Тип сообщения
     */
    public MessageType $MessageType;

    /**
     * @var bool $IsCritical Критичность сообщения
     */
    public bool $IsCritical;

    /**
     * @var string $Message Текст сообщения
     */
    public string $Message;

    /**
     * Конструктор
     *
     * @param MessageType $type Тип сообщения
     * @param bool $isCritical Критичность сообщения
     * @param string $message Текст сообщения
     */
    public function __construct (MessageType $type = MessageType::Info, bool $isCritical = false, string $message = "")
    {
        $this->MessageType = $type;
        $this->IsCritical = $isCritical;
        $this->Message = $message;
    }

    /**
     * @inheritDoc
     */
    public function UnSerialize (string $serialized): void
    {
        // Десериализую массив
        $array = json_decode($serialized, true);

        // Заполняю поля
        $this->MessageType =
            isset($array["MessageType"]) ? MessageType::FromName($array["MessageType"]) : MessageType::Info;
        $this->IsCritical = isset($array["IsCritical"]) && $array["IsCritical"] == 1;
        $this->Message = $array["Message"] ?? "";
    }

    /**
     * @inheritDoc
     */
    public function Serialize (): string
    {
        // Создаю массив результата
        $result = [];

        // Заполняю массив
        $result["MessageType"] = $this->MessageType->GetValue();
        $result["IsCritical"] = $this->IsCritical ? 1 : 0;
        $result["Message"] = $this->Message;

        // Сериализую
        return json_encode($result);
    }
}