using UnityEngine;
using System;
using System.Collections.Generic;

namespace mgaia.Utils
{
    /// <summary>
    /// Versão do parser para pegar textos armazenados em arquivos asset da Unity
    /// </summary>
    /// <owner>Victor</owner>
    internal class UnityAssetLocalizationParser : BaseLocalizationParser
    {
        private LocalizationFileScriptableObject mLocalizationFile;
        private SystemLanguage mSystemLanguage;

        public override bool Load(SystemLanguage systemLanguage)
        {
            mLocalizationFile = ResourceLoader.Load<LocalizationFileScriptableObject>(Constants.LOCALE_FOLDER_NAME, systemLanguage.ToString(), ResourceLoader.ResourceExtension.Asset);
            mSystemLanguage = systemLanguage;

            return mLocalizationFile != null;
        }

        public override string GetText(string session, string key)
        {
            LocalizedSessionSerializable sessionObject = GetSession(session);

            if (sessionObject == null)
            {
                throw new KeyNotFoundException("Não foi possível achar a sessão de nome " + session + ", lingua = " + mSystemLanguage.ToString() + " !");
            }

            TranslationSerializable translation = GetTranslation(sessionObject, key);

            if (translation == null)
            {
                throw new KeyNotFoundException("Não foi possível achar a tradução de nome na  " + key + ", lingua = " + mSystemLanguage.ToString() + " !");
            }

            return translation.Value;
        }

        public override bool ContainsSession(string session)
        {
            return GetSession(session) != null;
        }

        public override bool ContainsKey(string session, string key)
        {
            LocalizedSessionSerializable localizedSessionObject = GetSession(session);

            if (localizedSessionObject == null)
            {
                throw new KeyNotFoundException("Não foi possível achar a sessão de nome " + session + ", lingua = " + mSystemLanguage.ToString() + " !");
            }

            TranslationSerializable translation = GetTranslation(localizedSessionObject, key);

            return translation != null;
        }

        private LocalizedSessionSerializable GetSession(string session)
        {
            return mLocalizationFile.Sessions.First(lSession => lSession.Name.Equals(session));
        }

        private TranslationSerializable GetTranslation(LocalizedSessionSerializable session, string key)
        {
            return session.Translations.First(translation => translation.Name.Equals(key));
        }
    }
}