using OWML.Common;
using System;
using System.ComponentModel;
using UnityEngine;
namespace NewHorizons.Utility
{
    public static class Logger
    {

        private static LogType _logLevel = LogType.Error;

        public static void UpdateLogLevel(LogType newLevel)
        {
            _logLevel = newLevel;
        }

        public static void LogProperties(UnityEngine.Object obj)
        {
            foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(obj))
            {
                string name = descriptor?.Name;
                object value;
                try
                {
                    value = descriptor.GetValue(obj);
                }
                catch (Exception)
                {
                    value = null;
                }

                Log($"{obj.name} {name}={value}");
            }
        }

        public static void LogPath(GameObject go)
        {
            if (go == null) Log("Can't print path: GameObject is null");
            else Log($"{SearchUtilities.GetPath(go.transform)}");
        }

        public static void Log(string text, LogType type)
        {
            if ((int)type < (int)_logLevel) return;
            Main.Instance.ModHelper.Console.WriteLine(Enum.GetName(typeof(LogType), type) + " : " + text, LogTypeToMessageType(type));
        }

        public static void Log(string text)
        {
            Log(text, LogType.Log);
        }
        public static void LogError(string text)
        {
            Log(text, LogType.Error);
        }
        public static void LogWarning(string text)
        {
            Log(text, LogType.Warning);
        }
        public enum LogType
        {
            Todo,
            Log,
            Warning,
            Error,
        }
        private static MessageType LogTypeToMessageType(LogType t)
        {
            switch (t)
            {
                case LogType.Error:
                    return MessageType.Error;
                case LogType.Warning:
                    return MessageType.Warning;
                default:
                    return MessageType.Info;
            }
        }
    }
}
