using System;
using System.Reflection;

namespace Config.Net.TypeParsers
{
   class DefaultParser
   {
      public bool TryParse(string? value, Type t, out object? result)
      {
         if(IsEnum(t))
         {
            if(value == null)
            {
               result = null;
               return false;
            }

            try
            {
               result = Enum.Parse(t, value, true);
               return true;
            }
            catch(ArgumentException)
            {

            }
            catch(OverflowException)
            {

            }

            result = null;
            return false;
         }

         throw new NotSupportedException();
      }

      public bool IsSupported(Type t)
      {
         return IsEnum(t);
      }

      public string? ToRawString(object? value)
      {
         if(value == null) return null;

         Type t = value.GetType();

         if(IsEnum(t))
         {
            return value.ToString();
         }

         throw new NotSupportedException();
      }

      static bool IsEnum(Type t)
      {
         if(t == null) return false;

         //try to get the underlying type if this is a nullable type
         Type? nullable = Nullable.GetUnderlyingType(t);
         if(nullable != null) t = nullable;

         return t.GetTypeInfo().IsEnum;
      }
   }
}
