﻿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_GoogleSpreadsheet()
    {
        var sourceObj = new GameObject("Source").AddComponent<LanguageSource>();
        var source = sourceObj.mSource;
        mObjectsToCleanup.Add(sourceObj.gameObject);
        Selection.activeObject = sourceObj;

        source.Google_WebServiceURL = "https://script.google.com/macros/s/AKfycbxqUSmg5HAmCt8mo-3joUfwXQ7frCbmatT9sdmLbVoH0ZOUOVhO/exec";

        yield return RepaintEditor();

        #region Get Spreadsheet List

        LocalizationEditor.mCurrentViewMode = LocalizationEditor.eViewMode.ImportExport;
        LocalizationEditor.mLanguageSourceEditor.mSpreadsheetMode = LocalizationEditor.eSpreadsheetMode.Google;
        LocalizationEditor.mTestAction = LocalizationEditor.eTest_ActionType.Button_GoogleSpreadsheet_RefreshList;
        LocalizationEditor.mGoogleSpreadsheets.Clear();
        foreach (var v in WWWfinished())
            yield return null;

        Assert.IsTrue(LocalizationEditor.mGoogleSpreadsheets.Count > 0);
        Assert.IsFalse(LocalizationEditor.mGoogleSpreadsheets.Any((kvp) => !kvp.Key.StartsWith("I2Loc")));
        Assert.IsTrue(LocalizationEditor.mGoogleSpreadsheets.ContainsValue("1nNwzZkSK-olYxOzmqY-pBQFx-PpsdFTXh-daUUN2tMA"));

        #endregion


        #region Fill Random data

        int randomVal = Random.Range(0, 1000);
        var complexText1 = "Another\n\n\"this \nis\'frank\' hey\" [font] and [/final] more <tag></tag> text " + randomVal;
        var complexText2 = "Description\n\n\"this \nis\'frank\' hey\" [font] and [/final] more <tag></tag> text " + randomVal;

        source.AddLanguage("English");
        source.AddLanguage("Spanish");
        source.AddLanguage("Arabic");
        source.AddLanguage("TestLang");
        source.mLanguages[source.GetLanguageIndex("TestLang")].SetEnabled(false);


        var termData1 = source.AddTerm("Term1");
        for (int i = 0; i < source.mLanguages.Count; ++i)
            termData1.Languages[i] = "My text" + randomVal;

        var termData2 = source.AddTerm("Category/Term2");
        for (int i = 0; i < source.mLanguages.Count; ++i)
            termData2.Languages[i] = complexText1;

        var termData4 = source.AddTerm("Term4");
        termData4.Languages[0] = "'SpecialCases";
        termData4.Languages[1] = "''SpecialCases'";
        termData4.Languages[2] = "'SpecialCases'";
        termData4.Languages[3] = "=SpecialCases";

        #endregion

        #region Export-Replace

        LocalizationEditor.mTestAction = LocalizationEditor.eTest_ActionType.Button_GoogleSpreadsheet_Export;
        LocalizationEditor.mTestActionArg = eSpreadsheetUpdateMode.Replace;
        source.Google_SpreadsheetKey = "1nNwzZkSK-olYxOzmqY-pBQFx-PpsdFTXh-daUUN2tMA";
        source.Google_SpreadsheetName = null;
        LocalizationEditor.ClearErrors();

        foreach (var v in WWWfinished())
            yield return null;

        Assert.IsTrue(string.IsNullOrEmpty(LocalizationEditor.mLocalizationMsg));

        #endregion

        #region Export-Add New Terms

        for (int i = 0; i < source.mLanguages.Count; ++i)
            termData2.Languages[i] = "changed";
        var termData3 = source.AddTerm("Category/SubCategory/Term3");
        termData3.Description = complexText2;
        termData3.TermType = eTermType.Font;
        for (int i = 0; i < source.mLanguages.Count; ++i)
            termData3.Languages[i] = "Extra term" + randomVal;

        LocalizationEditor.mCurrentViewMode = LocalizationEditor.eViewMode.ImportExport;
        LocalizationEditor.mTestAction = LocalizationEditor.eTest_ActionType.Button_GoogleSpreadsheet_Export;
        LocalizationEditor.mTestActionArg = eSpreadsheetUpdateMode.AddNewTerms;
        source.Google_SpreadsheetKey = "1nNwzZkSK-olYxOzmqY-pBQFx-PpsdFTXh-daUUN2tMA";
        source.Google_SpreadsheetName = null;
        LocalizationEditor.ClearErrors();

        foreach (var v in WWWfinished())
            yield return null;

        Assert.IsTrue(string.IsNullOrEmpty(LocalizationEditor.mLocalizationMsg));

        #endregion

        #region Clear Data

        source.ClearAllData();
        Assert.IsTrue(source.GetTermData("Term1") == null);
        Assert.IsTrue(source.GetLanguageIndex("English")==-1);

        source.AddLanguage("French");
        source.AddTerm("TermFrench");
        Assert.IsTrue(source.GetTermData("TermFrench").Languages.Length == 1);

        #endregion

        #region Import-Replace

        LocalizationEditor.mCurrentViewMode = LocalizationEditor.eViewMode.ImportExport;
        LocalizationEditor.mTestAction = LocalizationEditor.eTest_ActionType.Button_GoogleSpreadsheet_Import;
        LocalizationEditor.mTestActionArg = eSpreadsheetUpdateMode.Replace;
        LocalizationEditor.ClearErrors();

        foreach (var v in WWWfinished())
            yield return null;

        Assert.IsTrue(string.IsNullOrEmpty(LocalizationEditor.mLocalizationMsg));
        Assert.IsTrue(source.GetTermData("TermFrench")==null);
        Assert.IsTrue(source.GetTermData("Term1").TermType == eTermType.Text);
        Assert.IsTrue(source.GetTermData("Category/Term2").GetTranslation(0) == complexText1);
        Assert.IsTrue(source.mLanguages.Count == 4);

        termData3 = source.GetTermData("Category/SubCategory/Term3");
        Assert.IsTrue(termData3.Description == complexText2);
        Assert.IsTrue(termData3.TermType == eTermType.Font);

        termData4 = source.GetTermData("Term4");
        Assert.IsTrue(termData4.GetTranslation(0) == "'SpecialCases");
        Assert.IsTrue(termData4.GetTranslation(1) == "''SpecialCases'");
        Assert.IsTrue(termData4.GetTranslation(2) == "'SpecialCases'");
        Assert.IsTrue(termData4.GetTranslation(3) == "=SpecialCases");

        #endregion

        #region Export-Merge

        termData2 = source.GetTermData("Category/Term2");
        termData2.Description = "Desc";
        termData2.TermType = eTermType.Sprite;
        for (int i = 0; i < source.mLanguages.Count; ++i)
            termData2.Languages[i] = "second change"+randomVal;

        LocalizationEditor.mCurrentViewMode = LocalizationEditor.eViewMode.ImportExport;
        LocalizationEditor.mTestAction = LocalizationEditor.eTest_ActionType.Button_GoogleSpreadsheet_Export;
        LocalizationEditor.mTestActionArg = eSpreadsheetUpdateMode.Merge;
        LocalizationEditor.ClearErrors();

        foreach (var v in WWWfinished())
            yield return null;

        Assert.IsTrue(string.IsNullOrEmpty(LocalizationEditor.mLocalizationMsg));

        #endregion

        #region Import-Merge

        for (int i = 0; i < source.mLanguages.Count; ++i)
            termData2.Languages[i] = "wrong value";
        termData2.Description = "--";
        termData2.TermType = eTermType.Material;

        LocalizationEditor.mCurrentViewMode = LocalizationEditor.eViewMode.ImportExport;
        LocalizationEditor.mTestAction = LocalizationEditor.eTest_ActionType.Button_GoogleSpreadsheet_Import;
        LocalizationEditor.mTestActionArg = eSpreadsheetUpdateMode.Merge;
        LocalizationEditor.ClearErrors();

        foreach (var v in WWWfinished())
            yield return null;

        termData2 = source.GetTermData("Category/Term2");
        Assert.IsTrue(termData2.Description == "Desc");
        Assert.IsTrue(termData2.GetTranslation(0) == ("second change" + randomVal));
        Assert.IsTrue(termData2.TermType == eTermType.Sprite);
        Assert.IsTrue(LocalizationEditor.mCurrentViewMode == LocalizationEditor.eViewMode.Keys);
        Assert.IsTrue(source.mLanguages.Count == 4);

        #endregion

    }
}
