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

using LibS7Adv;
using CtrEditor.Simulacion;
using CommunityToolkit.Mvvm.ComponentModel;
using nkast.Aether.Physics2D.Common;
using System.Windows.Media;
using CtrEditor.FuncionesBase;

namespace CtrEditor.ObjetosSim
{
    /// <summary>
    /// Interaction logic for ucBotella.xaml
    /// </summary>
    /// 

    public partial class osBotella : osBase, IosBase
    {
        private simBotella SimGeometria;

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

        public static string NombreClase()
        {
            return "Botella";
        }
        private string nombre = NombreClase();
        public override string Nombre
        {
            get => nombre;
            set => SetProperty(ref nombre, value);
        }

        public override void OnMove(float LeftPixels, float TopPixels) 
        {
            UpdateAfterMove();
        }

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

        [ObservableProperty]
        private Brush colorButton_oculto;

        [ObservableProperty]
        private float diametro;

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

        [ObservableProperty]
        private string velocidad_desde_simulacion;
        [ObservableProperty]
        private float inercia_desde_simulacion;

        [ObservableProperty]
        private bool preserve_Outside_Transport;

        [ObservableProperty]
        private float porcentaje_Traccion;

        [ObservableProperty]
        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 && !RemoverDesdeSimulacion)
            {                
                SimGeometria.SetPosition(GetCentro());
            }
        }

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

        public void UpdateAfterMove()
        {
            if (!RemoverDesdeSimulacion)
            {
                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);
            if (SimGeometria.isRestricted)
                ColorButton_oculto = Brushes.Yellow;
            else
            {
                if (SimGeometria.isOnTransports > 0)
                    ColorButton_oculto = Brushes.Red;
                else
                    ColorButton_oculto = Brushes.Gray;
            }

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

            // Eliminar la botella si esta fuera de un transporte
            if (!Preserve_Outside_Transport && Porcentaje_Traccion == 0 && Math.Abs(SimGeometria.Body.LinearVelocity.X) <= 0.001 && Math.Abs(SimGeometria.Body.LinearVelocity.Y) <= 0.001)
                RemoverDesdeSimulacion = true;

            Velocidad_desde_simulacion = SimGeometria.Body.LinearVelocity.ToString();
            Inercia_desde_simulacion = SimGeometria.Body.Inertia;
            Porcentaje_Traccion = SimGeometria.OverlapPercentage;
        }

        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.AddCircle(Diametro, GetCentro(), Mass);
        }
        public override void ucUnLoaded()
        {
            // El UserControl se esta eliminando
            // eliminar el objeto de simulacion
            simulationManager.Remove(SimGeometria);
        }

    }

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

        public ucBotella()
        {
            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;
        }
    }
}
