﻿using System.Collections;

namespace AsmodeeDigital.Common.Plugin.Utils
{
    /// <summary>
    /// This class helps to logs events of the Unity Plugin in a stantardized and
    /// easily parsable way.
    /// Debug and Info levels are not logged in release builds.
    /// </summary>
    public static class AsmoLogger
    {
        private enum Severity
        {
            Debug,
            Info,
            Warning,
            Error
        }

        public static void Debug(string module, string message, Hashtable extraInfo)
        {
            if (!UnityEngine.Debug.isDebugBuild) {
                return;
            }

            _log(Severity.Debug, module, message, extraInfo);
        }

        public static void Info(string module, string message, Hashtable extraInfo)
        {
            if (!UnityEngine.Debug.isDebugBuild) {
                return;
            }

            _log(Severity.Info, module, message, extraInfo);
        }
        
        public static void Warning(string module, string message, Hashtable extraInfo)
        {
            _log(Severity.Warning, module, message, extraInfo);
        }
        
        public static void Error(string module, string message, Hashtable extraInfo)
        {
            _log(Severity.Error, module, message, extraInfo);
        }

        private static void _log(Severity severity, string module, string message, Hashtable extraInfo)
        {
            string fullMessage = string.Format(
                "[{0}][{1}][{2}] {3}",
                System.DateTime.Now.ToString(new System.Globalization.CultureInfo("fr-FR")),
                severity,
                module,
                message);
            
            if (extraInfo != null && extraInfo.Count > 0) {
                string json = MiniJSON.Json.Serialize(extraInfo);
                fullMessage += " " + json;
            }

            switch (severity)
            {
                case Severity.Error:
                    UnityEngine.Debug.LogError(fullMessage);
                    break;

                case Severity.Warning:
                    UnityEngine.Debug.LogWarning(fullMessage);
                    break;

                case Severity.Info:
                case Severity.Debug:
                default:
                    UnityEngine.Debug.Log(fullMessage);
                    break;
            }
        }
    }
}
