<?php

namespace Shm\ShmChat\SchemaChat;

use Shm\ShmUtils\DeepAccess;

/*
Полная структура
[
    ShmChannelsField::SPACE => null,
    ShmChannelsField::NAME => null,
    ShmChannelsField::LAST_MESSAGE => null,
    ShmChannelsField::PAYLOAD => null,
    ShmChannelsField::REFERENCE => [
        [
            ShmChannelsField::EL_REFERENCE__DOCUMENT_ID => null,
            ShmChannelsField::EL_REFERENCE__DOCUMENT_COLLECTION => null,
            ShmChannelsField::EL_REFERENCE__UUID => null,
        ],
    ],
    ShmChannelsField::MEMBERS => [
        [
            ShmChannelsField::EL_MEMBERS__OWNER => null,
            ShmChannelsField::EL_MEMBERS__OWNER_COLLECTION => null,
            ShmChannelsField::EL_MEMBERS__IS_ADMIN => null,
            ShmChannelsField::EL_MEMBERS__UUID => null,
        ],
    ],
    ShmChannelsField::JOINABLE_MEMBERS => [
        [
            ShmChannelsField::EL_JOINABLE_MEMBERS__OWNER => null,
            ShmChannelsField::EL_JOINABLE_MEMBERS__OWNER_COLLECTION => null,
            ShmChannelsField::EL_JOINABLE_MEMBERS__IS_ADMIN => null,
            ShmChannelsField::EL_JOINABLE_MEMBERS__UUID => null,
        ],
    ],
    ShmChannelsField::CLOSED => null,
    ShmChannelsField::UNREAD_COUNTS => null,
    ShmChannelsField::PINNED_MESSAGE_ID => null,
    ShmChannelsField::_ID => null,
    ShmChannelsField::CREATED_AT => null,
    ShmChannelsField::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 ShmChannelsField
{
	/** Класс коллекции */
	public const COLLECTION_CLASS = ShmChannels::class;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	/** _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 SPACE_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::SPACE, $defaultValue);
	}


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


	public static function PINNED_MESSAGE_ID_GET($data, $defaultValue = null)
	{
		return DeepAccess::get($data, self::PINNED_MESSAGE_ID, $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);
	}
}


