using System.Windows;
using System.Windows.Controls;
//using using Microsoft.Xna.Framework;

using LibS7Adv;
using CtrEditor.Simulacion;
using CommunityToolkit.Mvvm.ComponentModel;
using System.Numerics;
using System.Windows.Media;
using CtrEditor.FuncionesBase;
using System.ComponentModel;

namespace CtrEditor.ObjetosSim
{
    /// <summary>
    /// Interaction logic for ucBotellaCuelloCuello.xaml
    /// </summary>
    public partial class osBotellaCuello : osBase, IosBase
    {
        private simBotella SimGeometria;

        // Otros datos y métodos relevantes para la simulación

        public static string NombreClase()
        {
            return "Botella con Cuello";
        }

        public static string NombreCategoria()
        {
            return "Dinamicos";
        }
        private string nombre = NombreClase();

        [property: Category("Identificación")]
        [property: Description("Nombre identificativo del objeto")]
        [property: Name("Nombre")]
        public override string Nombre
        {
            get => nombre;
            set => SetProperty(ref nombre, value);
        }

        public override void TopChanged(float value)
        {
            UpdateAfterMove();
        }

        public override void LeftChanged(float value)
        {
            UpdateAfterMove();
        }

        public override void OnResize(float Delta_Width, float Delta_Height)
        {
            Diametro += Delta_Width;
        }

        [ObservableProperty]
        [property: Category("Apariencia")]
        [property: Description("Color del botón visual")]
        [property: Name("Color")]
        private Brush colorButton_oculto;

        [ObservableProperty]
        [property: Category("Configuración")]
        [property: Description("Diámetro de la botella")]
        [property: Name("Diámetro")]
        private float diametro;

        partial void OnDiametroChanged(float value)
        {
            SimGeometria?.SetDiameter(Diametro);
        }

        [ObservableProperty]
        [property: Category("Información")]
        [property: Description("Velocidad desde simulación")]
        [property: Name("Velocidad Simulación")]
        private string velocidad_desde_simulacion;

        [ObservableProperty]
        [property: Category("Información")]
        [property: Description("Inercia desde simulación")]
        [property: Name("Inercia Simulación")]
        private float inercia_desde_simulacion;

        [ObservableProperty]
        [property: Category("Información")]
        [property: Description("Porcentaje de tracción con transporte")]
        [property: Name("Porcentaje de Tracción")]
        private float porcentaje_Traccion;

        [ObservableProperty]
        [property: Category("Información")]
        [property: Description("Indica si la botella está en un transporte con freno")]
        [property: Name("En Transporte con Freno")]
        private bool enTransporteConFreno;

        [ObservableProperty]
        [property: Category("Simulación")]
        [property: Description("Masa de la botella")]
        [property: Name("Masa")]
        private float mass;
        partial void OnMassChanged(float value)
        {
            SimGeometria?.SetMass(value);
        }

        public Vector2 GetCentro()
        {
            return new Vector2(Left + Diametro / 2, Top + Diametro / 2);
        }

        public void SetCentro(float x, float y)
        { Left = x; Top = y; }

        public void SetCentro(Vector2 centro)
        {
            Left = centro.X - Diametro / 2;
            Top = centro.Y - Diametro / 2;
        }

        private void ActualizarGeometrias()
        {
            if (SimGeometria != null)
            {

                SimGeometria.SetPosition(GetCentro());
            }
        }

        public osBotellaCuello()
        {
            Diametro = 0.10f;
            Mass = 1;
            ColorButton_oculto = Brushes.Gray;
        }

        public void UpdateAfterMove()
        {
            ActualizarGeometrias();
            SimGeometria?.SetDiameter(Diametro);
        }

        public override void UpdateGeometryStart()
        {
            // Se llama antes de la simulacion
            ActualizarGeometrias();
            SimGeometria?.SetDiameter(Diametro);
        }
        public override void UpdateGeometryStep()
        {
            // Se llama antes de la simulacion
            ActualizarGeometrias();
        }
        public override void UpdateControl(int elapsedMilliseconds)
        {
            SetCentro(SimGeometria.Center);

            // Sistema de colores jerarquizado para diferentes estados
            if (SimGeometria.isRestricted)
                ColorButton_oculto = Brushes.Yellow;  // Estado restringido (prioridad alta)
            else if (SimGeometria.isOnBrakeTransport)
                ColorButton_oculto = Brushes.Blue;    // En transporte con freno - NUEVO ESTADO
            else if (SimGeometria.IsOnAnyTransport())
                ColorButton_oculto = Brushes.Red;     // En transporte normal
            else
                ColorButton_oculto = Brushes.Gray;    // Estado libre

            // Ha sido marcada para remover
            if (SimGeometria.Descartar)
                RemoverDesdeSimulacion = true;

            // ✅ ELIMINADO: Lógica redundante - BEPU.cs ya elimina botellas que caen en Z automáticamente

            Velocidad_desde_simulacion = SimGeometria.GetLinearVelocity().ToString();
            Inercia_desde_simulacion = SimGeometria.Mass; // En BEPU usamos masa en lugar de inercia directa
            Porcentaje_Traccion = SimGeometria.OverlapPercentage;
            EnTransporteConFreno = SimGeometria.isOnBrakeTransport;  // Actualizar estado de freno
        }

        public override void ucLoaded()
        {
            // El UserControl ya se ha cargado y podemos obtener las coordenadas para 
            // crear el objeto de simulacion
            base.ucLoaded();
            SimGeometria = simulationManager.AddBotella(Diametro, GetCentro(), Mass);
        }
        public override void ucUnLoaded()
        {
            // El UserControl se esta eliminando
            // eliminar el objeto de simulacion
            simulationManager.Remove(SimGeometria);
        }

    }

    public partial class ucBotellaCuello : UserControl, IDataContainer
    {
        public osBase? Datos { get; set; }
        public int zIndex_fromFrames { get; set; }

        public ucBotellaCuello()
        {
            InitializeComponent();
            this.Loaded += OnLoaded;
            this.Unloaded += OnUnloaded;
        }
        private void OnLoaded(object sender, RoutedEventArgs e)
        {
            Datos?.ucLoaded();
        }
        private void OnUnloaded(object sender, RoutedEventArgs e)
        {
            Datos?.ucUnLoaded();
        }

        public void Highlight(bool State) { }
        public ZIndexEnum ZIndex_Base()
        {
            return ZIndexEnum.Dinamicos;
        }
    }
}
