﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LLVM.ClangTidy
{
    /// <summary>
    /// Allows entire categories of properties to be enabled, disabled, or inherited
    /// in one fell swoop.  We add properties to each category with the value being
    /// this enum, and when the value is selected, we use reflection to find all other
    /// properties in the same category and perform the corresponding action.
    /// </summary>
    public enum CategoryVerb
    {
        None,
        Disable,
        Enable,
        Inherit
    }

    public class CategoryVerbConverter : EnumConverter
    {
        public CategoryVerbConverter() : base(typeof(CategoryVerb))
        {
        }

        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            if (value is string)
            {
                switch ((string)value)
                {
                    case "Disable Category":
                        return CategoryVerb.Disable;
                    case "Enable Category":
                        return CategoryVerb.Enable;
                    case "Inherit Category":
                        return CategoryVerb.Inherit;
                    case "":
                        return CategoryVerb.None;
                }
            }
            return base.ConvertFrom(context, culture, value);
        }

        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
        {
            if (value is CategoryVerb && destinationType == typeof(string))
            {
                switch ((CategoryVerb)value)
                {
                    case CategoryVerb.Disable:
                        return "Disable Category";
                    case CategoryVerb.Enable:
                        return "Enable Category";
                    case CategoryVerb.Inherit:
                        return "Inherit Category";
                    case CategoryVerb.None:
                        return String.Empty;
                }
            }

            return base.ConvertTo(context, culture, value, destinationType);
        }
    }
}
