﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LLVM.ClangTidy
{
    class MagicInheritance
    {
        public static readonly string Value = "{3A27184D-1774-489B-9BB7-7191B8E8E622}";
        public static readonly string Text = "<Inherit from project or parent>";
    }


    class DynamicPropertyConverter<T> : TypeConverter
    {
        private DynamicPropertyDescriptor<T> Descriptor_;
        private TypeConverter Root_;

        public DynamicPropertyConverter(DynamicPropertyDescriptor<T> Descriptor, TypeConverter Root)
        {
            Descriptor_ = Descriptor;
            Root_ = Root;
        }

        /// <summary>
        /// Returns true if there are specific values that can be chosen from a dropdown
        /// for this property.  Regardless of whether standard values are supported for
        /// the underlying type, we always support standard values because we need to
        /// display the inheritance option.
        /// </summary>
        /// <returns>true</returns>
        public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
        {
            return true;
        }

        /// <summary>
        /// Get the set of all standard values that can be chosen from a dropdown for this
        /// property.  If the underlying type supports standard values, we want to include
        /// all those.  Additionally, we want to display the option to inherit the value,
        /// but only if the value is not already inheriting.
        /// </summary>
        public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
        {
            List<object> Values = new List<object>();
            if (Root_.GetStandardValuesSupported(context))
            {
                StandardValuesCollection RootValues = Root_.GetStandardValues(context);
                Values.AddRange(RootValues.Cast<object>());
            }
            if (!Descriptor_.IsInheriting)
                Values.Add(MagicInheritance.Value);
            StandardValuesCollection Result = new StandardValuesCollection(Values);
            return Result;
        }

        /// <summary>
        /// Determines whether this property can accept values other than those specified
        /// in the dropdown (for example by manually typing into the field).
        /// </summary>
        public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
        {
            // Although we add items to the dropdown list, we do not change whether or not
            // the set of values are exclusive.  If the user could type into the field before
            // they still can.  And if they couldn't before, they still can't.
            return Root_.GetStandardValuesExclusive(context);
        }

        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
        {
            return Root_.CanConvertFrom(context, sourceType);
        }

        public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
        {
            return Root_.CanConvertTo(context, destinationType);
        }

        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            if (value.Equals(MagicInheritance.Value))
                return MagicInheritance.Text;
            return Root_.ConvertFrom(context, culture, value);
        }

        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
        {
            if (value.GetType() == destinationType)
                return value;

            return Root_.ConvertTo(context, culture, value, destinationType);
        }

        public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)
        {
            return Root_.CreateInstance(context, propertyValues);
        }

        public override bool Equals(object obj)
        {
            return Root_.Equals(obj);
        }

        public override bool GetCreateInstanceSupported(ITypeDescriptorContext context)
        {
            return Root_.GetCreateInstanceSupported(context);
        }

        public override int GetHashCode()
        {
            return Root_.GetHashCode();
        }

        public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
        {
            return Root_.GetProperties(context, value, attributes);
        }

        public override bool GetPropertiesSupported(ITypeDescriptorContext context)
        {
            return Root_.GetPropertiesSupported(context);
        }

        public override bool IsValid(ITypeDescriptorContext context, object value)
        {
            return Root_.IsValid(context, value);
        }

        public override string ToString()
        {
            return Root_.ToString();
        }
    }
}
