<?php

namespace Shm\ShmAddons\EventTicketAddon\Types\HallType;

use Shm\ShmUtils\DeepAccess;

/*
Полная структура
[
    HallElementsField::HALL_U_U_I_D => null,
    HallElementsField::X => null,
    HallElementsField::Y => null,
    HallElementsField::WIDTH => null,
    HallElementsField::HEIGHT => null,
    HallElementsField::ROTATION => null,
    HallElementsField::LABEL => null,
    HallElementsField::POINTS => null,
    HallElementsField::TYPE => null,
    HallElementsField::SEAT => [
        HallElementsField::SEAT__NUMBER_KEY => null,
        HallElementsField::SEAT__ROW_KEY => null,
    ],
    HallElementsField::SECTOR => null,
    HallElementsField::_ID => null,
    HallElementsField::CREATED_AT => null,
    HallElementsField::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 HallElementsField
{
	/** Класс коллекции */
	public const COLLECTION_CLASS = HallElements::class;

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

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

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

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

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

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

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

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

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

	/** type (Enum) полный пусть ключа */
	public const TYPE = 'type';

	public const TYPE_ENUM_ALL_KEYS_VALUES = [
		'seat' => 'Место',
		'sector' => 'Сектор',
		'table' => 'Стол',
		'stage' => 'Сцена',
		'wall' => 'Стена',
		'zone' => 'Зона',
		'sector_polygon' => 'Сектор (сводобной формы)',
		'canvas' => 'Поверхность для рисования',
	];

	/** Enum type: Место */
	public const TYPE_ENUM_SEAT = 'seat';

	/** Enum type: Сектор */
	public const TYPE_ENUM_SECTOR = 'sector';

	/** Enum type: Стол */
	public const TYPE_ENUM_TABLE = 'table';

	/** Enum type: Сцена */
	public const TYPE_ENUM_STAGE = 'stage';

	/** Enum type: Стена */
	public const TYPE_ENUM_WALL = 'wall';

	/** Enum type: Зона */
	public const TYPE_ENUM_ZONE = 'zone';

	/** Enum type: Сектор (сводобной формы) */
	public const TYPE_ENUM_SECTOR_POLYGON = 'sector_polygon';

	/** Enum type: Поверхность для рисования */
	public const TYPE_ENUM_CANVAS = 'canvas';

	/** Enum type */
	public const TYPE_ENUM_ALL_KEYS = ['seat', 'sector', 'table', 'stage', 'wall', 'zone', 'sector_polygon', 'canvas'];

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

	/** number полный пусть ключа */
	public const SEAT__NUMBER = 'seat.number';

	/** number ключ */
	public const SEAT__NUMBER_KEY = 'number';

	/** row полный пусть ключа */
	public const SEAT__ROW = 'seat.row';

	/** row ключ */
	public const SEAT__ROW_KEY = 'row';

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

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


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


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


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


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


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


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


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


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


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


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


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


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


