
using LibS7Adv;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using Newtonsoft.Json;
using CommunityToolkit.Mvvm.ComponentModel;
using System.Collections.ObjectModel;
using LiveChartsCore;
using LiveChartsCore.SkiaSharpView;
using LiveChartsCore.Defaults;
using System.Diagnostics;
using CtrEditor.FuncionesBase;
using System.ComponentModel;

namespace CtrEditor.ObjetosSim
{
    /// <summary>
    /// Interaction logic for ucTraceSimple.xaml
    /// </summary>
    public partial class osTraceSimple : osBase, IosBase
    {

        private List<float> data;
        Stopwatch stopwatch;
        private double YScale { get; set; }

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

        public static string NombreClase()
        {
            return "Trazador Simple";
        }

        public static string NombreCategoria()
        {
            return "Traces";
        }
        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);
        }

        [ObservableProperty]
        [property: Category("Configuración")]
        [property: Description("Alto del trazador")]
        [property: Name("Alto")]
        float alto;

        [ObservableProperty]
        [property: Category("Configuración")]
        [property: Description("Ancho del trazador")]
        [property: Name("Ancho")]
        float ancho;

        [ObservableProperty]
        [property: Category("Enlace PLC")]
        [property: Description("Tag PLC para la serie de datos")]
        [property: Name("Tag Serie")]
        string tag_serie;

        [ObservableProperty]
        [property: Category("Configuración")]
        [property: Description("Nombre del eje X")]
        [property: Name("Nombre Eje X")]
        string x_Series_Name;

        [ObservableProperty]
        [property: Category("Configuración")]
        [property: Description("Nombre del eje Y")]
        [property: Name("Nombre Eje Y")]
        string y_Series_Name;

        private readonly ObservableCollection<ObservableValue> _observableValues;


        public ObservableCollection<ISeries> Series { get; set; }

        public osTraceSimple()
        {
            // Use ObservableCollections to let the chart listen for changes (or any INotifyCollectionChanged). 
            _observableValues = new ObservableCollection<ObservableValue>();
            Series = new ObservableCollection<ISeries>
              {
                new LineSeries<ObservableValue>
                {
                    Values = _observableValues,
                    Fill = null
                }
            };
            data = new List<float>();
            stopwatch = new Stopwatch();

            YScale = 2.0;
            Alto = 1;
            Ancho = 1;
        }

        public override void UpdateGeometryStart()
        {
            // Se llama antes de la simulacion

        }

        public override void UpdatePLCPrimerCiclo()
        {
            stopwatch.Start();
        }

        public override void UpdatePLC(PLCViewModel plc, int elapsedMilliseconds)
        {
            if (Tag_serie != null && Tag_serie.Length > 0)
            {
                var value = LeerBitTag(Tag_serie) == false ? 0 : 1;
                data.Add(value);
            }
            if (data.Count > 50)
                data.RemoveAt(0);
            if (stopwatch.Elapsed.TotalMilliseconds > 1000)
            {
                stopwatch.Reset();
                stopwatch.Start();
                foreach (var v in data)
                {
                    _observableValues.Add(new(v));
                    if (_observableValues.Count > 50)
                        _observableValues.RemoveAt(0);
                }

            }
        }

        public override void UpdateControl(int elapsedMilliseconds)
        {
            // Calculamos la velocidad

        }

        public override void ucLoaded()
        {
            // El UserControl ya se ha cargado y podemos obtener las coordenadas para 
            // crear el objeto de simulacion
            base.ucLoaded();

        }
    }

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

        public ucTraceSimple()
        {
            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 Resize(float width, float height)
        {
            if (Datos is osTraceSimple datos)
            {
                datos.Ancho += PixelToMeter.Instance.calc.PixelsToMeters(width);
                datos.Alto += PixelToMeter.Instance.calc.PixelsToMeters(height);
            }
        }
        public void Move(float LeftPixels, float TopPixels)
        {
            if (Datos != null)
            {
                Datos.Left = PixelToMeter.Instance.calc.PixelsToMeters(LeftPixels);
                Datos.Top = PixelToMeter.Instance.calc.PixelsToMeters(TopPixels);
            }
        }
        public float Angle() { return 0; }
        public void Rotate(float Angle) { }
        public void Highlight(bool State) { }
        public ZIndexEnum ZIndex_Base()
        {
            return ZIndexEnum.Trace;
        }

    }

}
