using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using GCGame.Table;
using UnityEngine.EventSystems;

// 夺旗战右侧mini地图
public class CaptureFlagMiniMapCtr : MonoBehaviour {

    private static CaptureFlagMiniMapCtr instance;
    public static CaptureFlagMiniMapCtr Instance
    {
        get { return instance; }
    }

    private Dictionary<int, Image> itemDic = new Dictionary<int, Image>();  // 
    public Image prefab;                                                    // 地图图片
    public float scale;                                                     // 3维 -> 2维 长度比

    public Animator anim;
    public Button switchBtn;                                                // 切换至组队信息按钮
    public Button showBtn;                                                  // 隐藏按钮
    public Button hideBtn;                                                  // 显示按钮

    #region new

    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
        }

        switchBtn.onClick.AddListener(OnSwitchOffBtnClick);
        showBtn.onClick.AddListener(OnShowOrHideBtnClick);
        hideBtn.onClick.AddListener(OnShowOrHideBtnClick);

        MissionDialogAndLeftTabsLogic.SetSwitch(UIInfo.CaptureFlagMiniMap);
        MissionDialogAndLeftTabsLogic.Instance().SetSwitchBtn();
    }

    public void Show(int id, int camp)
    {
        if(itemDic.ContainsKey(id))
        {
            LoadAssetBundle.Instance.SetImageSprite(itemDic[id], GetCampFlagSpriteName(camp));
        }
    }

    private void OnDestroy()
    {
        if (instance != null)
        {
            instance = null;
        }

        MissionDialogAndLeftTabsLogic.m_SwitchIndex = null;
    }

    private void OnSwitchOffBtnClick()
    {
        //anim.Play("SwitchOff");

        if (MissionDialogAndLeftTabsLogic.Instance() == null)
        {
            UIManager.ShowUI(UIInfo.MissionInfoController, delegate (bool bSuccess, object param)
            {
                if (bSuccess == false)
                    return;
                MissionDialogAndLeftTabsLogic.SetSwitch(UIInfo.CaptureFlagMiniMap);
                MissionDialogAndLeftTabsLogic.Instance().SetSwitchBtn();
            });
        }
        else
        {
            MissionDialogAndLeftTabsLogic.Instance().HideMissionDialog(true);
            MissionDialogAndLeftTabsLogic.SetSwitch(UIInfo.CaptureFlagMiniMap);
            MissionDialogAndLeftTabsLogic.Instance().SetSwitchBtn();
        }

        UIManager.CloseUI(UIInfo.CaptureFlagMiniMap);
    }

    private void OnShowOrHideBtnClick()
    {
        var clipInfo = anim.GetCurrentAnimatorStateInfo(0);
        if (clipInfo.IsName("SwitchOn") || clipInfo.IsName("Show"))
        {
            anim.Play("Hide");
        }
        else if (clipInfo.IsName("Hide"))
        {
            anim.Play("Show");
        }
    }

    private string GetCampFlagSpriteName(int camp)
    {
        string result = "";
        switch (camp)
        {
            case 0:
                result = "flagZhong";
                break;
            case 1:
                result = "flagTian";
                break;
            case 2:
                result = "flagDi";
                break;
            case 3:
                result = "flagRen";
                break;
        }

        return result;
    }

    #endregion

    public RawImage MapImage;
    public GameObject m_pointMainPlayer;
    public GameObject m_pointDot;

    private MapInterface m_mapInterface = new MapInterface();

    void OnEnable()
    {
        anim.Play("SwitchOn");
        Games.Events.EventDispatcher.Instance.Add(Games.Events.EventId.OnChangeSceneOver, OnChangeScene);
        if (MissionDialogAndLeftTabsLogic.Instance() != null)
        {
            MissionDialogAndLeftTabsLogic.Instance().HideMissionDialog(false);
            MissionDialogAndLeftTabsLogic.SetSwitch(UIInfo.CaptureFlagMiniMap);
        }
    }

    void OnDisable()
    {
        Games.Events.EventDispatcher.Instance.Remove(Games.Events.EventId.OnChangeSceneOver, OnChangeScene);
        if (MissionDialogAndLeftTabsLogic.Instance() != null)
            MissionDialogAndLeftTabsLogic.Instance().HideMissionDialog(true);
    }

    public void OnChangeScene(object param)
    {
        if (MissionDialogAndLeftTabsLogic.Instance() != null)
        {
            MissionDialogAndLeftTabsLogic.Instance().HideMissionDialog(false);
            MissionDialogAndLeftTabsLogic.SetSwitch(UIInfo.CaptureFlagMiniMap);
        }
    }

    public void OpenMissionLeftTab()
    {
        if (MissionDialogAndLeftTabsLogic.Instance() == null)
        {
            UIManager.ShowUI(UIInfo.MissionInfoController, delegate (bool bSuccess, object param)
            {
                if (bSuccess == false)
                    return;
                MissionDialogAndLeftTabsLogic.SetSwitch(UIInfo.CaptureFlagMiniMap);
                MissionDialogAndLeftTabsLogic.Instance().SetSwitchBtn();
                UIManager.CloseUI(UIInfo.CaptureFlagMiniMap);
            });
        }
        else
        {
            MissionDialogAndLeftTabsLogic.Instance().HideMissionDialog(true);
            MissionDialogAndLeftTabsLogic.SetSwitch(UIInfo.CaptureFlagMiniMap);
            MissionDialogAndLeftTabsLogic.Instance().SetSwitchBtn();
            UIManager.CloseUI(UIInfo.CaptureFlagMiniMap);
        }
    }

    //点击场景地图图片时的寻路
    public void OnSceneMapClick(PointerEventData eventData)
    {
        if (m_mapInterface != null)
        {
            var mainPlayer = Singleton<ObjManager>.Instance.MainPlayer;
            if (mainPlayer != null)
            {
                if (mainPlayer.isAutoCombat)
                {
                    GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("#{9009}"));
                    return;
                }

                var movePos = m_mapInterface.ScreenPosToScenePos(eventData.position);
                if (movePos == null)
                    mainPlayer.StopMove();
                else
                    mainPlayer.MainPlayMoveToPos(movePos.Value);
            }
        }
    }

    void Start()
    {
        if (null == SceneMapFix.Instance())
        {
            ResourceManager.InstantiateResource("Prefab/Logic/SceneMapFix", "SceneMapFix");
        }

        Tab_SceneClass sceneInfo = TableManager.GetSceneClassByID(GameManager.gameManager.RunningScene, 0);
        if (sceneInfo == null)
            return;
        if (m_mapInterface == null)
            m_mapInterface = new MapInterface();
        m_mapInterface.Init(MapImage.rectTransform, null, null, null, null);
        m_mapInterface.InitNavPointPrefab(m_pointDot);
        if (MapImage != null && string.IsNullOrEmpty(sceneInfo.SceneMapTexture) == false)
        {
            m_mapInterface.SetMapImage(sceneInfo.SceneMapTexture, MapImage);
        }

        mainPlayRect = m_pointMainPlayer.GetComponent<RectTransform>();
    }

    public void Update()
    {
        MainPlayerPos();
        if (m_mapInterface != null)
        {
            m_mapInterface.UpdateNavPoint();
        }
    }

    private void CaptureFlagInit()
    {
        var tab = TableManager.GetCrossSerFlagPoint().Values;
        itemDic.Clear();
        foreach (var kv in tab)
        {
            if (kv != null)
            {
                Image newOne = Instantiate<Image>(prefab);
                newOne.transform.SetParent(MapImage.rectTransform);
                newOne.transform.localScale = Vector3.one;
                newOne.gameObject.SetActive(true);

                Vector3 tabPos = new Vector3(kv.BornPosX, 0.0f, kv.BornPosZ);
                var newPos = SceneMapFix.Instance().ScenePosToMapPosVec3(tabPos, MapImage.rectTransform);
                newOne.GetComponent<RectTransform>().anchoredPosition = newPos;

                itemDic[kv.Id] = newOne;
                Show(kv.Id, kv.BornCampIndex);
            }
        }
    }

    private RectTransform mainPlayRect;

    public void MainPlayerPos()
    {
        if (m_pointMainPlayer != null && Singleton<ObjManager>.Instance.MainPlayer != null && SceneMapFix.Instance() != null)
        {
            Vector3 newPos = SceneMapFix.Instance().ScenePosToMapPosVec3(Singleton<ObjManager>.Instance.MainPlayer.Position, MapImage.rectTransform);
            mainPlayRect.anchoredPosition3D = newPos;
            mainPlayRect.transform.SetAsLastSibling();
        }
    }

    public void UpdateFlag(SynCrossSerFlagInfo info)
    {
        if (itemDic.Count == 0)
        {
            CaptureFlagInit();
        }

        for (int i = 0; i < info.pointInfo.Count; ++i)
        {
            Show(info.pointInfo[i].Index, info.pointInfo[i].CampIndex);
        }
    }
}