using System;
using System.Reflection;
using Server.Commands;
using Server.Commands.Generic;
using Server.Network;

namespace Server.Gumps
{
    public class SetCustomEnumGump : SetListOptionGump
    {
        private readonly string[] m_Names;

        public SetCustomEnumGump(
            PropertyInfo prop, Mobile mobile, object o, PropertiesGump propertiesGump, string[] names
        ) : base(prop, mobile, o, propertiesGump, names, null) =>
            m_Names = names;

        public override void OnResponse(NetState sender, in RelayInfo relayInfo)
        {
            var from = sender.Mobile;

            if (!BaseCommand.IsAccessible(from, m_Object))
            {
                from.SendMessage("You may no longer access their properties.");
                return;
            }

            var index = relayInfo.ButtonID - 1;

            if (index >= 0 && index < m_Names.Length)
            {
                try
                {
                    var info = m_Property.PropertyType.GetMethod("Parse", new[] { typeof(string) });

                    string result;

                    if (info != null)
                    {
                        result = Properties.SetDirect(
                            m_Mobile,
                            m_Object,
                            m_Object,
                            m_Property,
                            m_Property.Name,
                            info.Invoke(null, new object[] { m_Names[index] }),
                            true
                        );
                    }
                    else if (m_Property.PropertyType == typeof(Enum) || m_Property.PropertyType.IsSubclassOf(typeof(Enum)))
                    {
                        result = Properties.SetDirect(
                            m_Mobile,
                            m_Object,
                            m_Object,
                            m_Property,
                            m_Property.Name,
                            Enum.Parse(m_Property.PropertyType, m_Names[index], false),
                            true
                        );
                    }
                    else
                    {
                        result = "";
                    }

                    m_Mobile.SendMessage(result);

                    if (result == "Property has been set.")
                    {
                        m_PropertiesGump.OnValueChanged(m_Object, m_Property);
                    }
                }
                catch
                {
                    m_Mobile.SendMessage("An exception was caught. The property may not have changed.");
                }
            }

            m_PropertiesGump.SendPropertiesGump();
        }
    }
}
