<?php

namespace Shm\ShmChat\SchemaChat;

use Shm\ShmUtils\DeepAccess;

/*
Полная структура
[
    ShmChannelMessagesField::CHANNEL => null,
    ShmChannelMessagesField::CLIENT_MESSAGE_ID => null,
    ShmChannelMessagesField::OWNER => null,
    ShmChannelMessagesField::OWNER_COLLECTION => null,
    ShmChannelMessagesField::TEXT => null,
    ShmChannelMessagesField::TYPE => null,
    ShmChannelMessagesField::ATTACHMENTS => [
        [
            ShmChannelMessagesField::EL_ATTACHMENTS___ID => null,
            ShmChannelMessagesField::EL_ATTACHMENTS__FILE_TYPE => null,
            ShmChannelMessagesField::EL_ATTACHMENTS__NAME => null,
            ShmChannelMessagesField::EL_ATTACHMENTS__URL => null,
            ShmChannelMessagesField::EL_ATTACHMENTS__TYPE => null,
            ShmChannelMessagesField::EL_ATTACHMENTS__CREATED_AT => null,
        ],
    ],
    ShmChannelMessagesField::REPLY => null,
    ShmChannelMessagesField::VOICE => [
        ShmChannelMessagesField::VOICE___ID_KEY => null,
        ShmChannelMessagesField::VOICE__FILE_TYPE_KEY => null,
        ShmChannelMessagesField::VOICE__NAME_KEY => null,
        ShmChannelMessagesField::VOICE__URL_KEY => null,
        ShmChannelMessagesField::VOICE__DURATION_KEY => null,
        ShmChannelMessagesField::VOICE__TYPE_KEY => null,
        ShmChannelMessagesField::VOICE__CREATED_AT_KEY => null,
    ],
    ShmChannelMessagesField::ACTIONS => [
        [
            ShmChannelMessagesField::EL_ACTIONS__NAME => null,
            ShmChannelMessagesField::EL_ACTIONS__TYPE => null,
            ShmChannelMessagesField::EL_ACTIONS__VALUE => null,
            ShmChannelMessagesField::EL_ACTIONS__TEXT => null,
            ShmChannelMessagesField::EL_ACTIONS__STYLE => null,
            ShmChannelMessagesField::EL_ACTIONS__UUID => null,
        ],
    ],
    ShmChannelMessagesField::REACTIONS => [
        [
            ShmChannelMessagesField::EL_REACTIONS__USER => null,
            ShmChannelMessagesField::EL_REACTIONS__TYPE => null,
            ShmChannelMessagesField::EL_REACTIONS__CREATED_AT => null,
            ShmChannelMessagesField::EL_REACTIONS__UUID => null,
        ],
    ],
    ShmChannelMessagesField::PINNED => [
        ShmChannelMessagesField::PINNED__ENABLED_KEY => null,
        ShmChannelMessagesField::PINNED__USER_KEY => null,
        ShmChannelMessagesField::PINNED__TIMESTAMP_KEY => null,
    ],
    ShmChannelMessagesField::PAYLOAD => null,
    ShmChannelMessagesField::VIEWED => null,
    ShmChannelMessagesField::DELETED => null,
    ShmChannelMessagesField::_ID => null,
    ShmChannelMessagesField::CREATED_AT => null,
    ShmChannelMessagesField::UPDATED_AT => null,
]
*/

/**
 * Контракт строковых ключей полей. Не DTO, не коллекция, не значения полей.
 *
 * Как выбирать константу:
 * 1) Документ: filter, $set, $unset, sort, projection → константа без суффикса (полный путь с точками).
 *    updateOne([_ID => $id], ['$set' => [STATUS => $v, INIT_RESULT__PAYMENT_ID => $pid]])
 * 2) Собрать вложенный Structure как PHP-массив → внутри родителя ключи `_KEY` (локальное имя).
 *    SEAT => [SEAT__NUMBER_KEY => 1, SEAT__ROW_KEY => 'A']
 * 3) Собрать / прочитать элемент массива → `EL_{ARRAY}__{FIELD}` (путь от элемента, не от документа).
 *    '$push' => [CANCEL_RESULT => [EL_CANCEL_RESULT__REQUEST => $req]]
 *    foreach (NOTIFICATIONS_GET($doc) as $item) { EL_NOTIFICATIONS__UUID_GET($item); }
 * 4) Mongo: «поле в любом элементе массива» → `{ARRAY}__IDX__{FIELD}` = 'array.field'.
 *    Только filter/aggregate. Запрещено с *_GET, DeepAccess и как ключ PHP-массива документа.
 *
 * Чтение:
 * - `{CONST}_GET($data, $default)` — значение по пути. $default только если пути нет, а не когда в данных null.
 * - Вложенное поле нельзя читать как $data[INIT_RESULT__PAYMENT_ID]: в PHP нет ключа с точкой.
 * - EL_*_GET только от элемента массива. У IDX нет GET.
 * - ID-поле: GET возвращает ObjectId/скаляр, не подгруженный документ.
 *
 * Запись:
 * - Ключи документа = полные пути (п.1). Ключи элемента / $push = EL_ (п.3).
 * - Не используйте *_GET для записи.
 *
 * Не путать:
 * - COLLECTION_CLASS — PHP-класс коллекции (findOne, updateOne, insertOne).
 * - COLLECTION_NAME — строка-имя в MongoDB. Класс туда не подставлять.
 * - Константа поля — ключ. `{FIELD}_ENUM_{VALUE}` — значение. Пишите STATUS => STATUS_ENUM_ACTIVE, не STATUS => STATUS.
 * - Карта «Полная структура» над классом — справочник формы, не шаблон insert со всеми null.
 *
 * Жёстко:
 * - Имена полей только константами этого класса, никогда строками ('status', 'members.owner').
 * - Нет константы → нет поля в схеме. Не выдумывайте имена и не склеивайте пути ('a.'.$x).
 * - Не берите константы из чужого *Field для документа этой коллекции.
 * - `__` в имени константы = точка в пути. `_KEY` / `EL_` / `IDX` / `_ENUM_` — разные роли, не взаимозаменяемы.
 *
 * Файл генерируется автоматически. Не редактируйте вручную.
 */
class ShmChannelMessagesField
{
	/** Класс коллекции */
	public const COLLECTION_CLASS = ShmChannelMessages::class;

	/** Имя коллекции */
	public const COLLECTION_NAME = 'shmChannelMessages';

	/** channel (ObjectId) полный пусть ключа */
	public const CHANNEL = 'channel';

	/** clientMessageId полный пусть ключа */
	public const CLIENT_MESSAGE_ID = 'clientMessageId';

	/** owner (ObjectId) полный пусть ключа */
	public const OWNER = 'owner';

	/** ownerCollection полный пусть ключа */
	public const OWNER_COLLECTION = 'ownerCollection';

	/** Текст сообщения полный пусть ключа */
	public const TEXT = 'text';

	/** Тип сообщения (Enum) полный пусть ключа */
	public const TYPE = 'type';
	public const TYPE_ENUM_ALL_KEYS_VALUES = ['regular' => 'Обычное', 'system' => 'Системное'];

	/** Enum type: Обычное */
	public const TYPE_ENUM_REGULAR = 'regular';

	/** Enum type: Системное */
	public const TYPE_ENUM_SYSTEM = 'system';

	/** Enum type */
	public const TYPE_ENUM_ALL_KEYS = ['regular', 'system'];

	/** Вложения (Array) полный пусть ключа */
	public const ATTACHMENTS = 'attachments';

	/** _id (ObjectId) — ключ поля элемента массива */
	public const EL_ATTACHMENTS___ID = '_id';

	/** _id (ObjectId) — путь через массив (MongoDB IDX), не для GET */
	public const ATTACHMENTS__IDX___ID = 'attachments._id';

	/** fileType — ключ поля элемента массива */
	public const EL_ATTACHMENTS__FILE_TYPE = 'fileType';

	/** fileType — путь через массив (MongoDB IDX), не для GET */
	public const ATTACHMENTS__IDX__FILE_TYPE = 'attachments.fileType';

	/** name — ключ поля элемента массива */
	public const EL_ATTACHMENTS__NAME = 'name';

	/** name — путь через массив (MongoDB IDX), не для GET */
	public const ATTACHMENTS__IDX__NAME = 'attachments.name';

	/** url — ключ поля элемента массива */
	public const EL_ATTACHMENTS__URL = 'url';

	/** url — путь через массив (MongoDB IDX), не для GET */
	public const ATTACHMENTS__IDX__URL = 'attachments.url';

	/** type — ключ поля элемента массива */
	public const EL_ATTACHMENTS__TYPE = 'type';

	/** type — путь через массив (MongoDB IDX), не для GET */
	public const ATTACHMENTS__IDX__TYPE = 'attachments.type';

	/** created_at — ключ поля элемента массива */
	public const EL_ATTACHMENTS__CREATED_AT = 'created_at';

	/** created_at — путь через массив (MongoDB IDX), не для GET */
	public const ATTACHMENTS__IDX__CREATED_AT = 'attachments.created_at';

	/** reply (ObjectId) полный пусть ключа */
	public const REPLY = 'reply';

	/** voice (Structure) полный пусть ключа */
	public const VOICE = 'voice';

	/** _id (ObjectId) полный пусть ключа */
	public const VOICE___ID = 'voice._id';

	/** _id (ObjectId) ключ */
	public const VOICE___ID_KEY = '_id';

	/** fileType полный пусть ключа */
	public const VOICE__FILE_TYPE = 'voice.fileType';

	/** fileType ключ */
	public const VOICE__FILE_TYPE_KEY = 'fileType';

	/** name полный пусть ключа */
	public const VOICE__NAME = 'voice.name';

	/** name ключ */
	public const VOICE__NAME_KEY = 'name';

	/** url полный пусть ключа */
	public const VOICE__URL = 'voice.url';

	/** url ключ */
	public const VOICE__URL_KEY = 'url';

	/** duration полный пусть ключа */
	public const VOICE__DURATION = 'voice.duration';

	/** duration ключ */
	public const VOICE__DURATION_KEY = 'duration';

	/** type полный пусть ключа */
	public const VOICE__TYPE = 'voice.type';

	/** type ключ */
	public const VOICE__TYPE_KEY = 'type';

	/** created_at полный пусть ключа */
	public const VOICE__CREATED_AT = 'voice.created_at';

	/** created_at ключ */
	public const VOICE__CREATED_AT_KEY = 'created_at';

	/** Кнопки (Array) полный пусть ключа */
	public const ACTIONS = 'actions';

	/** Имя действия — ключ поля элемента массива */
	public const EL_ACTIONS__NAME = 'name';

	/** Имя действия — путь через массив (MongoDB IDX), не для GET */
	public const ACTIONS__IDX__NAME = 'actions.name';

	/** Тип — ключ поля элемента массива */
	public const EL_ACTIONS__TYPE = 'type';

	/** Тип — путь через массив (MongoDB IDX), не для GET */
	public const ACTIONS__IDX__TYPE = 'actions.type';

	/** Значение — ключ поля элемента массива */
	public const EL_ACTIONS__VALUE = 'value';

	/** Значение — путь через массив (MongoDB IDX), не для GET */
	public const ACTIONS__IDX__VALUE = 'actions.value';

	/** Текст кнопки — ключ поля элемента массива */
	public const EL_ACTIONS__TEXT = 'text';

	/** Текст кнопки — путь через массив (MongoDB IDX), не для GET */
	public const ACTIONS__IDX__TEXT = 'actions.text';

	/** Стиль (Enum) — ключ поля элемента массива */
	public const EL_ACTIONS__STYLE = 'style';

	/** Стиль (Enum) — путь через массив (MongoDB IDX), не для GET */
	public const ACTIONS__IDX__STYLE = 'actions.style';

	public const ACTIONS__STYLE_ENUM_ALL_KEYS_VALUES = [
		'default' => 'По умолчанию',
		'primary' => 'Основная',
		'danger' => 'Опасная',
	];

	/** Enum style: По умолчанию */
	public const ACTIONS__STYLE_ENUM_DEFAULT = 'default';

	/** Enum style: Основная */
	public const ACTIONS__STYLE_ENUM_PRIMARY = 'primary';

	/** Enum style: Опасная */
	public const ACTIONS__STYLE_ENUM_DANGER = 'danger';

	/** Enum style */
	public const ACTIONS__STYLE_ENUM_ALL_KEYS = ['default', 'primary', 'danger'];

	/** uuid — ключ поля элемента массива */
	public const EL_ACTIONS__UUID = 'uuid';

	/** uuid — путь через массив (MongoDB IDX), не для GET */
	public const ACTIONS__IDX__UUID = 'actions.uuid';

	/** Реакции (Array) полный пусть ключа */
	public const REACTIONS = 'reactions';

	/** user (ObjectId) — ключ поля элемента массива */
	public const EL_REACTIONS__USER = 'user';

	/** user (ObjectId) — путь через массив (MongoDB IDX), не для GET */
	public const REACTIONS__IDX__USER = 'reactions.user';

	/** type (Enum) — ключ поля элемента массива */
	public const EL_REACTIONS__TYPE = 'type';

	/** type (Enum) — путь через массив (MongoDB IDX), не для GET */
	public const REACTIONS__IDX__TYPE = 'reactions.type';

	public const REACTIONS__TYPE_ENUM_ALL_KEYS_VALUES = [
		'heart' => 'Сердце',
		'like' => 'Нравится',
		'laugh' => 'Смех',
		'wow' => 'Удивление',
		'sad' => 'Грусть',
		'angry' => 'Злость',
		'clap' => 'Аплодисменты',
		'party' => 'Праздник',
		'poop' => 'Какахa',
		'fire' => 'Огонь',
	];

	/** Enum type: Сердце */
	public const REACTIONS__TYPE_ENUM_HEART = 'heart';

	/** Enum type: Нравится */
	public const REACTIONS__TYPE_ENUM_LIKE = 'like';

	/** Enum type: Смех */
	public const REACTIONS__TYPE_ENUM_LAUGH = 'laugh';

	/** Enum type: Удивление */
	public const REACTIONS__TYPE_ENUM_WOW = 'wow';

	/** Enum type: Грусть */
	public const REACTIONS__TYPE_ENUM_SAD = 'sad';

	/** Enum type: Злость */
	public const REACTIONS__TYPE_ENUM_ANGRY = 'angry';

	/** Enum type: Аплодисменты */
	public const REACTIONS__TYPE_ENUM_CLAP = 'clap';

	/** Enum type: Праздник */
	public const REACTIONS__TYPE_ENUM_PARTY = 'party';

	/** Enum type: Какахa */
	public const REACTIONS__TYPE_ENUM_POOP = 'poop';

	/** Enum type: Огонь */
	public const REACTIONS__TYPE_ENUM_FIRE = 'fire';

	/** Enum type */
	public const REACTIONS__TYPE_ENUM_ALL_KEYS = [
		'heart',
		'like',
		'laugh',
		'wow',
		'sad',
		'angry',
		'clap',
		'party',
		'poop',
		'fire',
	];

	/** Когда поставлена — ключ поля элемента массива */
	public const EL_REACTIONS__CREATED_AT = 'created_at';

	/** Когда поставлена — путь через массив (MongoDB IDX), не для GET */
	public const REACTIONS__IDX__CREATED_AT = 'reactions.created_at';

	/** uuid — ключ поля элемента массива */
	public const EL_REACTIONS__UUID = 'uuid';

	/** uuid — путь через массив (MongoDB IDX), не для GET */
	public const REACTIONS__IDX__UUID = 'reactions.uuid';

	/** pinned (Structure) полный пусть ключа */
	public const PINNED = 'pinned';

	/** Закреплено полный пусть ключа */
	public const PINNED__ENABLED = 'pinned.enabled';

	/** Закреплено ключ */
	public const PINNED__ENABLED_KEY = 'enabled';

	/** Кто закрепил (ObjectId) полный пусть ключа */
	public const PINNED__USER = 'pinned.user';

	/** Кто закрепил (ObjectId) ключ */
	public const PINNED__USER_KEY = 'user';

	/** Когда закреплено полный пусть ключа */
	public const PINNED__TIMESTAMP = 'pinned.timestamp';

	/** Когда закреплено ключ */
	public const PINNED__TIMESTAMP_KEY = 'timestamp';

	/** payload (Structure) полный пусть ключа */
	public const PAYLOAD = 'payload';

	/** Прочитано полный пусть ключа */
	public const VIEWED = 'viewed';

	/** Кто удалил (ObjectId) полный пусть ключа */
	public const DELETED = 'deleted';

	/** _id (ObjectId) полный пусть ключа */
	public const _ID = '_id';

	/** created_at полный пусть ключа */
	public const CREATED_AT = 'created_at';

	/** updated_at полный пусть ключа */
	public const UPDATED_AT = 'updated_at';

	public static function CHANNEL_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::CHANNEL, $defaultValue);
	}


	public static function CLIENT_MESSAGE_ID_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::CLIENT_MESSAGE_ID, $defaultValue);
	}


	public static function OWNER_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::OWNER, $defaultValue);
	}


	public static function OWNER_COLLECTION_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::OWNER_COLLECTION, $defaultValue);
	}


	public static function TEXT_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::TEXT, $defaultValue);
	}


	public static function TYPE_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::TYPE, $defaultValue);
	}


	public static function ATTACHMENTS_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::ATTACHMENTS, $defaultValue);
	}


	public static function EL_ATTACHMENTS___ID_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::EL_ATTACHMENTS___ID, $defaultValue);
	}


	public static function EL_ATTACHMENTS__FILE_TYPE_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::EL_ATTACHMENTS__FILE_TYPE, $defaultValue);
	}


	public static function EL_ATTACHMENTS__NAME_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::EL_ATTACHMENTS__NAME, $defaultValue);
	}


	public static function EL_ATTACHMENTS__URL_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::EL_ATTACHMENTS__URL, $defaultValue);
	}


	public static function EL_ATTACHMENTS__TYPE_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::EL_ATTACHMENTS__TYPE, $defaultValue);
	}


	public static function EL_ATTACHMENTS__CREATED_AT_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::EL_ATTACHMENTS__CREATED_AT, $defaultValue);
	}


	public static function REPLY_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::REPLY, $defaultValue);
	}


	public static function VOICE_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::VOICE, $defaultValue);
	}


	public static function VOICE___ID_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::VOICE___ID, $defaultValue);
	}


	public static function VOICE__FILE_TYPE_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::VOICE__FILE_TYPE, $defaultValue);
	}


	public static function VOICE__NAME_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::VOICE__NAME, $defaultValue);
	}


	public static function VOICE__URL_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::VOICE__URL, $defaultValue);
	}


	public static function VOICE__DURATION_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::VOICE__DURATION, $defaultValue);
	}


	public static function VOICE__TYPE_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::VOICE__TYPE, $defaultValue);
	}


	public static function VOICE__CREATED_AT_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::VOICE__CREATED_AT, $defaultValue);
	}


	public static function ACTIONS_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::ACTIONS, $defaultValue);
	}


	public static function EL_ACTIONS__NAME_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::EL_ACTIONS__NAME, $defaultValue);
	}


	public static function EL_ACTIONS__TYPE_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::EL_ACTIONS__TYPE, $defaultValue);
	}


	public static function EL_ACTIONS__VALUE_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::EL_ACTIONS__VALUE, $defaultValue);
	}


	public static function EL_ACTIONS__TEXT_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::EL_ACTIONS__TEXT, $defaultValue);
	}


	public static function EL_ACTIONS__STYLE_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::EL_ACTIONS__STYLE, $defaultValue);
	}


	public static function EL_ACTIONS__UUID_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::EL_ACTIONS__UUID, $defaultValue);
	}


	public static function REACTIONS_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::REACTIONS, $defaultValue);
	}


	public static function EL_REACTIONS__USER_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::EL_REACTIONS__USER, $defaultValue);
	}


	public static function EL_REACTIONS__TYPE_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::EL_REACTIONS__TYPE, $defaultValue);
	}


	public static function EL_REACTIONS__CREATED_AT_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::EL_REACTIONS__CREATED_AT, $defaultValue);
	}


	public static function EL_REACTIONS__UUID_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::EL_REACTIONS__UUID, $defaultValue);
	}


	public static function PINNED_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::PINNED, $defaultValue);
	}


	public static function PINNED__ENABLED_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::PINNED__ENABLED, $defaultValue);
	}


	public static function PINNED__USER_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::PINNED__USER, $defaultValue);
	}


	public static function PINNED__TIMESTAMP_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::PINNED__TIMESTAMP, $defaultValue);
	}


	public static function PAYLOAD_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::PAYLOAD, $defaultValue);
	}


	public static function VIEWED_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::VIEWED, $defaultValue);
	}


	public static function DELETED_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::DELETED, $defaultValue);
	}


	public static function _ID_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::_ID, $defaultValue);
	}


	public static function CREATED_AT_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::CREATED_AT, $defaultValue);
	}


	public static function UPDATED_AT_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::UPDATED_AT, $defaultValue);
	}
}


