using System.Collections;
using Games.Events;
using Games.Scene;
using GCGame.Table;
using Module.Log;
using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneMapFix : MonoBehaviour
{
    private static SceneMapFix _Instance;
    //public Transform m_childPoint_MapToScene;
    public Transform m_childPoint_SceneToMap;
    public Transform m_FixRectObj;
    private BoxCollider _fixRectCollider;
    private int InitMapInfoScene = -100;
    private SceneMapFixData m_FixData;

    public static SceneMapFix Instance()
    {
        return _Instance;
    }

    public static void SetInstance(SceneMapFix instance)
    {
        _Instance = instance;
    }

    private void OnDestroy()
    {
        SetInstance(null);
        InitMapInfoScene = -100;
    }

    private void Awake()
    {
        SetInstance(this);
        InitMapInfoScene = -100;
        DontDestroyOnLoad(gameObject);
        _fixRectCollider = m_FixRectObj.GetComponent<BoxCollider>();
    }

    public string CurrSceneName
    {
        get { return m_FixData == null ? "" : m_FixData.SceneName; }
    }

    public Vector3 ScenePosToMapPosVec2(Vector2 scenePos, RectTransform m_Rect = null)
    {
        var realScenePos = new Vector3(scenePos.x, 0, scenePos.y);
        realScenePos = ActiveScene.GetTerrainPosition(realScenePos);
        return ScenePosToMapPosVec3(realScenePos, m_Rect);
    }

    public Vector3 ScenePosToMapPosVec3(Vector3 scenPos, RectTransform m_Rect = null)
    {
        var result = Vector3.zero;
        if (m_FixData != null)
        {
            var dir = -m_FixRectObj.forward;
            var ray = new Ray(scenPos, dir);
            RaycastHit hit;
            if (_fixRectCollider.Raycast(ray, out hit, float.PositiveInfinity))
                result = m_FixRectObj.worldToLocalMatrix.MultiplyPoint3x4(hit.point);
            if (m_Rect != null)
            {
                var x = m_Rect.sizeDelta.x * result.x;
                var y = m_Rect.sizeDelta.y * result.y;
                result.x = x;
                result.y = y;
            }
        }

        return result;
    }

    //mapPos  范围在(-0.5,-0.5)-- (0.5,0.5) 
    public Vector3 MapPosToScenePos(Vector2 mapPos)
    {
        if (m_FixData == null)
            return Vector3.zero;
        var raySource = m_FixRectObj.localToWorldMatrix.MultiplyPoint3x4(new Vector3(mapPos.x, mapPos.y, 0.5f));
        var ray = new Ray(raySource, m_FixRectObj.forward);
        var result = ActiveScene.GetTerrainPosition(ray);
        return result == null ? Vector3.zero : result.Value;
    }

    public void Start()
    {
        transform.position = Vector3.zero;
        transform.localEulerAngles = Vector3.zero;
        transform.localScale = Vector3.one;
        if (InitMapInfoScene == GameManager.gameManager.RunningScene && m_FixData!=null && m_FixRectObj!=null)
            return;
        var curScene = TableManager.GetSceneClassByID(GameManager.gameManager.RunningScene, 0);
        if (null == curScene)
        {
            LogModule.ErrorLog("load scene map table fail :" + GameManager.gameManager.RunningScene);
            return;
        }

        if (curScene.SceneMapTexture == null || curScene.SceneMapTexture.Length <= 0)
            return;
        if (curScene.SceneMapTexture.ToLower().Contains(SceneManager.GetActiveScene().name.ToLower()) == false)
            return;
        InitMapInfoScene = GameManager.gameManager.RunningScene;
        var table = new Hashtable();
        table["AssetType"] = typeof(SceneMapFixData);
        var sceneName = SceneManager.GetActiveScene().name.ToLower();
        LoadAssetBundle.Instance.LoadAsset(LoadAssetBundle.BUNDLE_PATH_Other + sceneName,
           sceneName, delegate (string assetName, Object resObj, Hashtable hashParam)
           {
               if (resObj != null)
               {
                   m_FixData = resObj as SceneMapFixData;
                   InitFixData();
               }
           },
           table, true);
    }

    private void InitFixData()
    {
        if (m_FixData == null)
            return;
        m_FixRectObj.localPosition = m_FixData.m_Pos;
        m_FixRectObj.localEulerAngles = m_FixData.m_EulerAngles;
        m_FixRectObj.localScale = new Vector3(m_FixData.m_SizeRect.x, m_FixData.m_SizeRect.y, 1);
        EventDispatcher.Instance.Dispatch(Games.Events.EventId.OnSceneMapFixLoadOver);
    }
}