using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

namespace LibHac.Tests
{
    internal class ResultNameResolver : Result.IResultNameResolver
    {
        private Lazy<Dictionary<Result, string>> ResultNames { get; } = new Lazy<Dictionary<Result, string>>(GetResultNames);

        public bool TryResolveName(Result result, out string name)
        {
            return ResultNames.Value.TryGetValue(result, out name);
        }

        private static Dictionary<Result, string> GetResultNames()
        {
            var dict = new Dictionary<Result, string>();

            Assembly assembly = typeof(Result).Assembly;

            foreach (TypeInfo type in assembly.DefinedTypes.Where(x => x.Name.Contains("Result")))
                foreach (PropertyInfo property in type.DeclaredProperties
                    .Where(x => x.PropertyType == typeof(Result.Base) && x.GetMethod?.IsStatic == true && x.SetMethod == null))
                {
                    object value = property.GetValue(null, null);
                    if (value is null) continue;

                    Result resultValue = ((Result.Base)value).Value;
                    string name = $"{type.Name}{property.Name}";

                    dict[resultValue] = name;
                }

            return dict;
        }
    }
}