﻿using JLGames.RocketDriver.Actions.Languages.Lua;
using JLGames.RocketDriver.Actions.Loaderx;
using JLGames.RocketDriver.Actions.Utils;
using UnityEngine;

namespace JLGames.RocketDriver.Samples.LuaDemo
{
    public class LuaHotfix : MonoBehaviour
    {
        [SerializeField] private string m_Bundle = "hot";
        [SerializeField] private string m_AssetPath = "hot/Cube.prefab";

        [SerializeField] private bool m_EnableFix = false;
        [SerializeField] private string m_AotName = "JLGames.RocketDriver.Samples.LuaDemo.MonoAOT";
        [SerializeField] private string m_LuaPath = "hot/Cube.lua";

        private void Start()
        {
            InitLoader();
        }

        private void InitLoader()
        {
            Loader.InitLoader("TestLuaSettings");
            Loader.InitVersion(OnVersionInited);
        }

        private void OnVersionInited(AssetBundleManifest asset, bool suc)
        {
            DebugUtil.Log("OnVersionInited:", suc);
            if (suc)
            {
                LoadHotfixPrefab();
            }
        }

        private void LoadHotfixPrefab()
        {
            Loader.LoadBundleAsync(m_Bundle, (bundleRef, suc) =>
            {
                if (!suc)
                {
                    DebugUtil.LogWarning($"LoadBundle[{m_Bundle}] Fail!");
                    return;
                }

                ShowHotfixPrefab(bundleRef);
            });
        }

        private void ShowHotfixPrefab(BundleRef bRef)
        {
            var prefab = Loader.LoadAssetSync<GameObject>(m_AssetPath, bRef.Bundle);
            if (null == prefab)
            {
                DebugUtil.LogWarning($"LoadAsset[{m_AssetPath}] Fail!");
                return;
            }

            DebugUtil.LogWarning($"LoadAsset[{m_AssetPath}] Succ!");

            var obj = Instantiate(prefab);
            HandleLuaFix(obj, bRef);
            TransformUtil.AddChildTo(obj.transform, transform.parent);
        }

        private void HandleLuaFix(GameObject obj, BundleRef bRef)
        {
            if (!m_EnableFix || string.IsNullOrEmpty(m_LuaPath)) return;

            var luaFile = Loader.LoadAssetSync<TextAsset>(m_LuaPath, bRef.Bundle);
            if (null == luaFile)
            {
                DebugUtil.LogWarning($"LoadLuaFile[{m_LuaPath}] Fail!");
                return;
            }

            if (string.IsNullOrEmpty(luaFile.text))
            {
                return;
            }

            LuaHotfixUtils.ReplactAot<LuaBehaviour>(obj, m_AotName, luaFile.text);
        }
    }
}