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

namespace EventsAppQuest.Domain.Models
{
    /// <summary>
    /// Item do showroom/proposta; representa um bloco do evento que futuramente pode virar elemento visual no cenario.
    /// </summary>
    [Serializable]
    public class ShowroomItem
    {
        /// <summary>Identificador unico.</summary>
        public string Id { get; set; }

        /// <summary>Nome do item.</summary>
        public string Name { get; set; }

        /// <summary>Tipo do item (decoracao, buffet, iluminacao, etc.).</summary>
        public ShowroomItemType Type { get; set; }

        /// <summary>Descricao opcional.</summary>
        public string Description { get; set; }

        /// <summary>Id do fornecedor associado.</summary>
        public string SupplierId { get; set; }

        /// <summary>Id do template de evento ao qual o item esta vinculado (opcional).</summary>
        public string EventTemplateId { get; set; }

        /// <summary>Se true, o item e incluido por padrao ao iniciar projeto com esse template.</summary>
        public bool IsIncludedByDefault { get; set; }

        /// <summary>Preco estimado mockado (valor comercial da proposta).</summary>
        public float EstimatedPrice { get; set; }

        /// <summary>Zona logica do evento onde o item sera posicionado (futura visualizacao espacial/MR).</summary>
        public PlacementZoneType PlacementZone { get; set; }

        /// <summary>Tipo de ancoragem espacial futura (chao, parede, teto, etc.).</summary>
        public SpatialAnchorType SpatialAnchorType { get; set; }

        /// <summary>Ordem de exibicao/posicionamento logico (menor = antes).</summary>
        public int DisplayOrder { get; set; }

        /// <summary>Lugares sentados que este item proporciona (ex.: mesa para 10).</summary>
        public int SeatingProvided { get; set; }

        /// <summary>Impacto na área em pé (ex.: +20 pessoas; 0 = neutro).</summary>
        public int StandingAreaImpact { get; set; }

        /// <summary>Se true, o item tende a bloquear circulação quando mal posicionado.</summary>
        public bool BlocksCirculation { get; set; }

        /// <summary>Se true, o item exige acesso de serviço (buffet, palco, apoio).</summary>
        public bool RequiresServiceAccess { get; set; }

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

        /// <summary>Peso de ocupação no slot (0-100; impacto no congestionamento).</summary>
        public int FootprintWeight { get; set; }

        /// <summary>Tempo estimado de montagem em minutos.</summary>
        public int SetupDurationMinutes { get; set; }

        /// <summary>Se true, o item exige montagem antecipada (antes de outros).</summary>
        public bool RequiresEarlySetup { get; set; }

        /// <summary>Tipos de dependência para montagem (ex.: "Stage", "Power"; outros itens devem estar prontos antes).</summary>
        public List<string> SetupDependencyTypes { get; set; } = new List<string>();

        /// <summary>Se true, exige fornecedor presente no local durante montagem/execução.</summary>
        public bool RequiresSupplierOnSite { get; set; }

        /// <summary>Prioridade de execução (0-10; maior = montar/executar antes).</summary>
        public int ExecutionPriority { get; set; }
    }
}
