# -*- coding: utf-8 -*-
# gui/components/model_view/_mv_racks.py
"""Логика работы с размещением стеллажей и связанными визуальными состояниями.

Этот модуль компонует полный ``RackPlacementMixin`` из набора
мелких подмиксинов, каждый из которых отвечает за отдельную область
логики размещения стеллажей. Также здесь хранятся константы уровня
класса, общие для всех подмиксинов.
"""

from __future__ import annotations

from gui.components.model_view._mv_racks_projection import RackPlacementProjectionMixin
from gui.components.model_view._mv_racks_visual import RackPlacementVisualMixin

from gui.components.model_view._mv_racks_lifecycle import RackLifecycleMixin
from gui.components.model_view._mv_racks_crud import RackCrudMixin
from gui.components.model_view._mv_racks_camera import RackCameraMixin
from gui.components.model_view._mv_racks_shelf import RackShelfMixin
from gui.components.model_view._mv_racks_selection import RackSelectionMixin
from gui.components.model_view._mv_racks_move import RackMoveMixin
from gui.components.model_view._mv_racks_picking import RackPickingMixin
from gui.components.model_view._mv_racks_shelf_render import RackShelfRenderMixin
from gui.components.model_view._mv_racks_hover import RackHoverMixin
from gui.components.model_view._mv_racks_preview import RackPreviewMixin
from gui.components.model_view._mv_racks_codes import RackCodesMixin
from gui.components.model_view._mv_racks_collision import RackCollisionMixin
from gui.components.model_view._mv_racks_mezzanine import RackMezzanineMixin


class RackPlacementMixin(
    RackLifecycleMixin,
    RackCrudMixin,
    RackCameraMixin,
    RackShelfMixin,
    RackSelectionMixin,
    RackMoveMixin,
    RackPickingMixin,
    RackShelfRenderMixin,
    RackHoverMixin,
    RackPreviewMixin,
    RackCodesMixin,
    RackCollisionMixin,
    RackMezzanineMixin,
    RackPlacementProjectionMixin,
    RackPlacementVisualMixin,
):
    """Миксин с логикой размещения стеллажей внутри зоны."""

    _PALLET_CENTER_SPAN_MM = 3706
    _PALLET_FOOTPRINT_WIDTH_SINGLE_MM = 3796
    _PALLET_DEPTH_MM = 1100
    _PALLET_HEIGHT_MM = 2505
    _PALLET_BUFFER_MM = 100
    _RACK_COLLISION_BUFFER_MM = 100
    _MAX_BUFFER_OVERLAP_MM = 100
    _MEZZANINE_CONTAINMENT_MARGIN_MM = 100
    _SHELF_NORMS = {
        "A": {
            "base_surface_offset_from_bbox_top_mm": 0.0,
            "min_base_height_mm": 80.0,
            "min_useful_height_mm": 16.0,
            "min_inter_shelf_mm": 53.0,
            "shelf_height_mm": 37.0,
            "step_mm": 53.0,
        },
        "B": {
            "base_surface_offset_from_bbox_top_mm": 15.0,
            "min_base_height_mm": 130.0,
            "min_useful_height_mm": 68.0,
            "min_inter_shelf_mm": 113.0,
            "shelf_height_mm": 45.0,
            "step_mm": 37.5,
        },
        "PALLET": {
            "base_surface_offset_from_bbox_top_mm": 55.0,
            "min_base_height_mm": 252.0,
            "min_useful_height_mm": 112.0,
            "min_inter_shelf_mm": 250.0,
            "shelf_height_mm": 250.0,
            "step_mm": 50.0,
        },
    }


# ---------------------------------------------------------------------------
# Module workflow notes
# ---------------------------------------------------------------------------
# 1) Задача модуля:
#    Композиционный фасад подсистемы стеллажей.
#
# 2) Последовательность действий и вызовов:
#    A. Композиционный класс RackPlacementMixin:
#       Назначение: объединяет поведение через RackLifecycleMixin, RackCrudMixin, RackCameraMixin, RackShelfMixin, RackSelectionMixin, RackMoveMixin, RackPickingMixin, RackShelfRenderMixin, RackHoverMixin, RackPreviewMixin, RackCodesMixin, RackCollisionMixin, RackMezzanineMixin, RackPlacementProjectionMixin, RackPlacementVisualMixin.
#       Собственная вычислительная логика отсутствует; маршрутизация идёт в родительские миксины.
#
# 3) Важные ограничения и инварианты:
#    - Модуль выполняется в составе ModelViewWidget и использует согласованные поля состояния self._... .
#    - Межмодульная связность: только через фасад model_view; прямые обращения между zone, rack, shelf, cell запрещены.
#    - Очистка состояния должна быть идемпотентной: повторный вызов не меняет корректное состояние в ошибочное.
#
# 4) Правило сопровождения:
#    - Любое изменение сценария должно сопровождаться обновлением этого блока с сохранением фактического порядка вызовов.
#    - При добавлении метода указывать его место в цепочке сценария (запуск, основной шаг, завершение, вспомогательная логика).
