using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using CtrEditor.PopUps;
using Xceed.Wpf.Toolkit.PropertyGrid;
using Xceed.Wpf.Toolkit.PropertyGrid.Editors;
using CtrEditor.Models;

namespace CtrEditor.ObjetosSim
{
    /// <summary>
    /// Atributo para marcar propiedades que deben usar el editor de etiquetas
    /// </summary>
    [AttributeUsage(AttributeTargets.Property)]
    public class TagEditorAttribute : Attribute
    {
        public Type? EditorType { get; }

        public TagEditorAttribute(Type? editorType = null)
        {
            EditorType = editorType;
        }
    }

    [AttributeUsage(AttributeTargets.Property)]
    public class NameAttribute : Attribute
    {
        public string DisplayName { get; }

        public NameAttribute(string displayName)
        {
            DisplayName = displayName ?? throw new ArgumentNullException(nameof(displayName));
        }
    }

    /// <summary>
    /// Editor personalizado para etiquetas en PropertyGrid
    /// </summary>
    public class TagPropertyEditor : ITypeEditor
    {
        public FrameworkElement ResolveEditor(PropertyItem propertyItem)
        {
            var grid = new Grid();
            grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
            grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });

            // TextBox para mostrar/editar etiquetas directamente
            var textBox = new TextBox();
            textBox.SetBinding(TextBox.TextProperty, new Binding("Value")
            {
                Source = propertyItem,
                Mode = BindingMode.TwoWay,
                UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
            });
            Grid.SetColumn(textBox, 0);

            // Botón para abrir el editor modal
            var button = new Button
            {
                Content = "...",
                Width = 25,
                Margin = new Thickness(2, 0, 0, 0),
                ToolTip = "Abrir editor de etiquetas"
            };

            button.Click += (sender, e) =>
            {
                try
                {
                    // Obtener el MainWindow para acceder a todos los objetos
                    var mainWindow = Application.Current.Windows
                        .OfType<MainWindow>()
                        .FirstOrDefault();

                    if (mainWindow?.DataContext is MainViewModel mainViewModel)
                    {
                        // Determinar si el objeto es osBase o ImageData
                        if (propertyItem.Instance is osBase osObject)
                        {
                            // Abrir el editor de etiquetas para osBase
                            var tagEditor = new TagEditorWindow(osObject, mainViewModel.ObjetosSimulables, mainViewModel._imageDataDictionary);
                            tagEditor.Owner = mainWindow;

                            if (tagEditor.ShowDialog() == true)
                            {
                                // La ventana ya actualiza el objeto directamente
                                // Actualizar el textbox con el nuevo valor
                                textBox.GetBindingExpression(TextBox.TextProperty)?.UpdateTarget();
                            }
                        }
                        else if (propertyItem.Instance is ImageData imageData)
                        {
                            // Para ImageData, crear un osBase temporal para usar el editor
                            var tempOsBase = new osTextPlate();
                            tempOsBase.Etiquetas = imageData.Etiquetas;

                            var tagEditor = new TagEditorWindow(tempOsBase, mainViewModel.ObjetosSimulables, mainViewModel._imageDataDictionary);
                            tagEditor.Owner = mainWindow;

                            if (tagEditor.ShowDialog() == true)
                            {
                                // Actualizar ImageData con las nuevas etiquetas
                                imageData.Etiquetas = tempOsBase.Etiquetas;
                                textBox.GetBindingExpression(TextBox.TextProperty)?.UpdateTarget();
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"Error al abrir el editor de etiquetas: {ex.Message}",
                        "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                }
            };

            Grid.SetColumn(button, 1);

            grid.Children.Add(textBox);
            grid.Children.Add(button);

            return grid;
        }
    }
}