using System;
using System.Collections.Generic;
using EventsAppQuest.Domain.Enums;

namespace EventsAppQuest.Domain.Models
{
    /// <summary>
    /// Slot/área lógica do layout do espaço. Representa "onde" um item pode ser colocado
    /// no plano lógico do ambiente, como preparação para futura visualização em MR.
    /// Ainda não há geometria 3D real.
    /// </summary>
    [Serializable]
    public class SpaceLayoutSlot
    {
        /// <summary>Identificador único.</summary>
        public string Id { get; set; }

        /// <summary>Nome do slot (ex.: Entrada principal, Palco).</summary>
        public string Name { get; set; }

        /// <summary>Id do espaço ao qual o slot pertence.</summary>
        public string SpaceId { get; set; }

        /// <summary>Zona lógica do evento (entrada, centro, palco, etc.).</summary>
        public PlacementZoneType PlacementZone { get; set; }

        /// <summary>Tipo de ancoragem espacial (chão, parede, teto, etc.).</summary>
        public SpatialAnchorType AnchorType { get; set; }

        /// <summary>Indicação de capacidade (quantos itens cabem; 0 = não limitado).</summary>
        public int CapacityHint { get; set; }

        /// <summary>Contribuição deste slot para a capacidade de convidados (ex.: mesas = 10 lugares).</summary>
        public int CapacityContribution { get; set; }

        /// <summary>Se true, é área de acomodação sentada (mesas, cadeiras).</summary>
        public bool IsSeatingArea { get; set; }

        /// <summary>Se true, é um slot principal do espaço.</summary>
        public bool IsPrimary { get; set; }

        /// <summary>Se true, a circulação por este slot é crítica (entrada, corredor, acesso).</summary>
        public bool IsCirculationCritical { get; set; }

        /// <summary>Prioridade de acesso (0-10; maior = mais crítico para acesso de serviço).</summary>
        public int AccessPriority { get; set; }

        /// <summary>Peso no risco de congestionamento (0-100; maior = mais sensível).</summary>
        public int CongestionRiskWeight { get; set; }

        /// <summary>Ids de slots/zones adjacentes (para análise de fluxo).</summary>
        public List<string> AdjacentZoneHints { get; set; } = new List<string>();

        /// <summary>Ordem de exibição no layout (menor = antes).</summary>
        public int DisplayOrder { get; set; }
    }
}
