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

        var localize = new GameObject("Text", typeof(TextMesh), typeof(I2.Loc.Localize)).GetComponent<Localize>();
        mObjectsToCleanup.Add(localize.gameObject);

        var obj1 = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/I2/Localization/Examples/Common/Meshes/Mesh_ES.prefab");
        var obj2 = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/I2/Localization/Examples/Common/Meshes/Mesh_US.prefab");
        var objRes1 = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/I2/Localization/Examples/Resources/References/Prefabs/Mesh_FR.prefab");

        Assert.IsTrue(obj1 != null);
        Assert.IsTrue(obj2 != null);
        Assert.IsTrue(objRes1 != null);

        #region LanguageSource Assets

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

        LocalizationEditor.mCurrentViewMode = LocalizationEditor.eViewMode.References;
        LocalizationEditor.mTestAction = LocalizationEditor.eTest_ActionType.Button_Assets_Add;
        LocalizationEditor.mTestActionArg = obj1;
        yield return RepaintEditor();
        LocalizationEditor.mTestAction = LocalizationEditor.eTest_ActionType.Button_Assets_Add;
        LocalizationEditor.mTestActionArg = obj2;
        yield return RepaintEditor();
        LocalizationEditor.mTestAction = LocalizationEditor.eTest_ActionType.Button_Assets_Add;
        LocalizationEditor.mTestActionArg = objRes1;
        yield return RepaintEditor();
        LocalizationEditor.mTestAction = LocalizationEditor.eTest_ActionType.Button_Assets_Add;
        LocalizationEditor.mTestActionArg = obj2;
        yield return RepaintEditor();
        LocalizationEditor.mTestAction = LocalizationEditor.eTest_ActionType.Button_Assets_Add;
        LocalizationEditor.mTestActionArg = objRes1;
        yield return RepaintEditor();

        Assert.IsTrue(source.Assets.Count == 2);
        Assert.IsTrue(source.mAssetDictionary.Count == 2);
        Assert.IsTrue(source.Assets.Contains(obj1));
        Assert.IsTrue(source.Assets.Contains(obj2));
        Assert.IsTrue(!source.Assets.Contains(objRes1));

        // Delete  ---------
        LocalizationEditor.mTestAction = LocalizationEditor.eTest_ActionType.Button_Assets_Delete;
        LocalizationEditor.mTestActionArg = source.Assets.IndexOf(obj2);
        yield return RepaintEditor();

        Assert.IsTrue(source.Assets.Count == 1);
        Assert.IsTrue(source.mAssetDictionary.Count == 1);
        Assert.IsTrue(!source.Assets.Contains(obj2));

        // Replace  ---------
        LocalizationEditor.mTestAction = LocalizationEditor.eTest_ActionType.Button_Assets_Replace;
        LocalizationEditor.mTestActionArg = source.Assets.IndexOf(obj1);
        LocalizationEditor.mTestActionArg2 = obj2;
        yield return RepaintEditor();

        Assert.IsTrue(source.Assets.Count == 1);
        Assert.IsTrue(source.mAssetDictionary.Count == 1);
        Assert.IsTrue(!source.Assets.Contains(obj1));
        Assert.IsTrue(source.Assets.Contains(obj2));

        #endregion

        #region Localize References

        Selection.activeObject = localize;
        localize.mGUI_ShowReferences = true;
        yield return RepaintEditor();

        LocalizationEditor.mTestAction = LocalizationEditor.eTest_ActionType.Button_Assets_Add;
        LocalizationEditor.mTestActionArg = obj1;
        yield return RepaintEditor();
        LocalizationEditor.mTestAction = LocalizationEditor.eTest_ActionType.Button_Assets_Add;
        LocalizationEditor.mTestActionArg = obj2;
        yield return RepaintEditor();
        LocalizationEditor.mTestAction = LocalizationEditor.eTest_ActionType.Button_Assets_Add;
        LocalizationEditor.mTestActionArg = objRes1;
        yield return RepaintEditor();
        LocalizationEditor.mTestAction = LocalizationEditor.eTest_ActionType.Button_Assets_Add;
        LocalizationEditor.mTestActionArg = obj2;
        yield return RepaintEditor();
        LocalizationEditor.mTestAction = LocalizationEditor.eTest_ActionType.Button_Assets_Add;
        LocalizationEditor.mTestActionArg = objRes1;
        yield return RepaintEditor();

        Assert.IsTrue(localize.TranslatedObjects.Count == 2);
        Assert.IsTrue(localize.mAssetDictionary.Count == 2);
        Assert.IsTrue(localize.TranslatedObjects.Contains(obj1));
        Assert.IsTrue(localize.TranslatedObjects.Contains(obj2));
        Assert.IsTrue(!localize.TranslatedObjects.Contains(objRes1));

        // Delete  ---------
        LocalizationEditor.mTestAction = LocalizationEditor.eTest_ActionType.Button_Assets_Delete;
        LocalizationEditor.mTestActionArg = localize.TranslatedObjects.IndexOf(obj2);
        yield return RepaintEditor();

        Assert.IsTrue(localize.TranslatedObjects.Count == 1);
        Assert.IsTrue(localize.mAssetDictionary.Count == 1);
        Assert.IsTrue(!localize.TranslatedObjects.Contains(obj2));

        // Replace  ---------
        LocalizationEditor.mTestAction = LocalizationEditor.eTest_ActionType.Button_Assets_Replace;
        LocalizationEditor.mTestActionArg = localize.TranslatedObjects.IndexOf(obj1);
        LocalizationEditor.mTestActionArg2 = obj2;
        yield return RepaintEditor();

        Assert.IsTrue(localize.TranslatedObjects.Count == 1);
        Assert.IsTrue(localize.mAssetDictionary.Count == 1);
        Assert.IsTrue(!localize.TranslatedObjects.Contains(obj1));
        Assert.IsTrue(localize.TranslatedObjects.Contains(obj2));

        #endregion
    }
}
