﻿using UnityEngine;
using UnityEngine.UI;
using UnityEditor;
using UnityEngine.TestTools;
using NUnit.Framework;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Linq;
using I2.Loc;

public partial class I2LocTest_EditMode_Basics
{
    [UnityTest, Category("Editor")]
    public IEnumerator Test_LanguageSource_Translate()
    {
        var sourceObj = new GameObject("Source").AddComponent<LanguageSource>();
        var source = sourceObj.mSource;
        mObjectsToCleanup.Add(sourceObj.gameObject);
        
        var locCmp = new GameObject("Text", typeof(TextMesh), typeof(I2.Loc.Localize)).GetComponent<I2.Loc.Localize>();
        locCmp.Term = "Term1";
        mObjectsToCleanup.Add(locCmp.gameObject);

        source.AddLanguage("English");
        source.AddLanguage("Spanish");
        source.AddLanguage("Arabic");

        var termData1 = source.AddTerm("Term1");
        termData1.Languages[0] = "Hello";

        var termData2 = source.AddTerm("Term2");
        termData2.Languages[1] = "Bienvenido";

        var termData3 = source.AddTerm("TestCategory/Term3");
        termData3.Languages[1] = "Tienes {[#POINTS]} bullets.";

        var termData4 = source.AddTerm("TestCategory/Sub/Term4");
        termData4.Languages[1] = "Tienes {[#POINTS]} balas.[i2p_Zero]No tienes balas.";

        var termData5 = source.AddTerm("Term5");
        termData5.Languages[1] = "[i2p_Plural]Tienes {[#POINTS]} balas.[i2p_Zero]No tienes balas.[i2p_One]Tienes 1 bala.";

        var termData6 = source.AddTerm("Term6");
        termData6.Languages[1] = "[i2p_Plural]El jugador {[name]} tiene {[#POINTS]} balas.[i2p_Zero]El jugador {[name]} no tiene balas.[i2p_One]El jugador {[name]} tiene 1 bala.";

        //Plural, but not parameter with #
        var termData7 = source.AddTerm("Term7");
        termData7.Languages[1] = "El jugador tiene {[POINTS]} balas.[i2p_Zero]El jugador no tiene balas.";


        Selection.activeObject = sourceObj;
        yield return RepaintEditor();


        LocalizationEditor.mKeyToExplore = "Term1";
        LocalizationEditor.mCurrentViewMode = LocalizationEditor.eViewMode.Keys;
        LocalizationEditor.mTestAction = LocalizationEditor.eTest_ActionType.Button_Term_TranslateAll;
        foreach (var v in FinishTranslating())
            yield return null;

        Assert.IsTrue(termData1.GetTranslation(1) == "Hola");
        Assert.IsTrue(termData1.GetTranslation(2) == "مرحبا");




        LocalizationEditor.mKeyToExplore = "Term2";
        LocalizationEditor.mTestAction = LocalizationEditor.eTest_ActionType.Button_Term_Translate;
        LocalizationEditor.mTestActionArg = 0;
        foreach (var v in FinishTranslating())
            yield return null;

        Assert.IsTrue(termData2.Languages[0].Contains("Welcome"));




        LocalizationEditor.mCurrentViewMode = LocalizationEditor.eViewMode.Languages;
        LocalizationEditor.mTestAction = LocalizationEditor.eTest_ActionType.Button_Languages_TranslateAll;
        LocalizationEditor.mTestActionArg = 0;
        foreach (var v in FinishTranslating())
            yield return null;

        Assert.IsTrue(TranslationContains(termData3.GetTranslation(0), "You have", "{[#POINTS]}", "bullets"));
        Assert.IsTrue(TranslationContains(termData4.GetTranslation(0), "You have", "{[#POINTS]}", "bullets", "[i2p_Zero]", "no"));
        Assert.IsTrue(TranslationContains(termData5.GetTranslation(0), "You have", "{[#POINTS]}", "bullets", "1"));
        Assert.IsTrue(TranslationContains(termData6.GetTranslation(0), "Player", "{[name]}", "bullets", "bullet", "no"));
        Assert.IsTrue(TranslationContains(termData7.GetTranslation(0), "Player", "{[POINTS]}", "bullets", "no"));
   }

    bool TranslationContains( string translation, params string[] words )
    {
        foreach (var word in words)
        {
            if (translation.IndexOf(word, System.StringComparison.OrdinalIgnoreCase)<0)
                return false;
        }
        return true;
    }

    IEnumerable FinishTranslating()
    {
        yield return RepaintEditor();
        yield return RepaintEditor();
        yield return null;
        while (GoogleTranslation.IsTranslating())
            yield return null;
    }
}
