using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Noesis;
using System.Collections.ObjectModel;

namespace Testing
{
    public class ParameterCollection : FreezableCollection<Parameter> { }

    [ContentProperty("Parameters")]
    public class ParameterList : DependencyObject
    {
        public ParameterList()
        {
            Parameters = new ParameterCollection();
        }

        public ParameterCollection Parameters
        {
            get { return (ParameterCollection)GetValue(ParametersProperty); }
            set { SetValue(ParametersProperty, value); }
        }

        public static readonly DependencyProperty ParametersProperty = DependencyProperty.Register(
            "Parameters", typeof(ParameterCollection), typeof(ParameterList),
            new PropertyMetadata(null));
    }

    public class Parameter : Freezable
    {
        public string Key
        {
            get { return (string)GetValue(KeyProperty); }
            set { SetValue(KeyProperty, value); }
        }

        public static readonly DependencyProperty KeyProperty = DependencyProperty.Register(
            "Key", typeof(string), typeof(Parameter),
            new PropertyMetadata(string.Empty));


        public string Value
        {
            get { return (string)GetValue(ValueProperty); }
            set { SetValue(ValueProperty, value); }
        }

        public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
            "Value", typeof(string), typeof(Parameter),
            new PropertyMetadata(string.Empty, OnValueChanged));

        private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            Parameter param = (Parameter)d;
            UnityEngine.Debug.Log($"Key={param.Key}, Value={e.NewValue}");
        }
    }

    public class DataItem
    {
        public string Name { get; set; }
    }
}

public class ParametersBehavior : MonoBehaviour
{
    void Start()
    {
        ObservableCollection<Testing.DataItem> list = new ObservableCollection<Testing.DataItem>
        {
            new Testing.DataItem { Name = "Item 1" },
            new Testing.DataItem { Name = "Item 2" },
            new Testing.DataItem { Name = "Item 3" },
            new Testing.DataItem { Name = "Item 4" },
            new Testing.DataItem { Name = "Item 5" }
        };

        NoesisView view = GetComponent<NoesisView>();
        view.Content.DataContext = list;
    }
}
