using System.IO;
using System.Text;
using UnityEditor;
using UnityEngine;
using WeChatWASM;

namespace TyphoonUnitySDK
{
    /// <summary>
    /// 微信游戏发布逻辑 
    /// </summary>
    public class PublishWxMini : IPublish
    {
        public void Publish(PublishSetting setting)
        {
            var result = new PublishResult();
            var config = WxMiniConfig.Default;
            //检查参数
            if (string.IsNullOrEmpty(config.AppId))
            {
                UniEditor.ShowMessageBox("未配置Appid,从发布窗口中配置", PublishWindow.Open);
                return;
            }

            if (string.IsNullOrEmpty(config.ProjectName))
            {
                UniEditor.ShowMessageBox("未配置游戏名,从发布窗口中配置", PublishWindow.Open);
                return;
            }

            //检查广告单元是否存在空格
            if (string.IsNullOrEmpty(config.BannerAdUnit) && config.BannerAdUnit.Contains(" "))
            {
                Debug.LogError("BannerAdUnit 存在空格请检查");
            }

            if (string.IsNullOrEmpty(config.IntersAdUnit))
            {
                Debug.LogError("IntersAdUnit 存在空格请检查");
            }

            if (string.IsNullOrEmpty(config.VideoAdUnit))
            {
                Debug.LogError("VideoAdUnit 存在空格请检查");
            }

            Debug.Log("写入微信发布工具参数...");
            //修改微信参数
            /*基础设置*/
            var wxToolConfig = UnityUtil.GetEditorConf();
            wxToolConfig.ProjectConf.Appid = config.AppId;
            wxToolConfig.ProjectConf.projectName = config.ProjectName;
            wxToolConfig.ProjectConf.CDN = VariablePreset.Default.ParserToString(config.CDN);
            var wxOrientation = WXScreenOritation.Portrait;
            switch (config.ScreenOrientation)
            {
                case Orientation.Portrait:
                    wxOrientation = WXScreenOritation.Portrait;
                    break;
                case Orientation.Landscape:
                    wxOrientation = WXScreenOritation.Landscape;
                    break;
            }

            wxToolConfig.ProjectConf.Orientation = wxOrientation;
            wxToolConfig.ProjectConf.MemorySize = config.MemorySize;
            wxToolConfig.ProjectConf.DST = config.DST;
            wxToolConfig.ProjectConf.assetLoadType = config.AssetLoadType;
            var bgSrc = config.LoadingBg == null
                ? $"{UniEditor.PathRoot}/Editor/Texture/black_32x32.png"
                : AssetDatabase.GetAssetPath(config.LoadingBg);
            wxToolConfig.ProjectConf.bgImageSrc = bgSrc;

            /*SDK 功能选项*/
            wxToolConfig.SDKOptions.UseFriendRelation = config.UseFriendRelation;
            wxToolConfig.SDKOptions.UseCompressedTexture = config.UseCompressedTexture;
            wxToolConfig.SDKOptions.UseMiniGameChat = config.UseMiniGameChat;
            wxToolConfig.SDKOptions.PreloadWXFont = config.PreloadWXFont;

            /*调试编译选项*/
            wxToolConfig.CompileOptions.DevelopBuild = config.DevelopBuild;
            wxToolConfig.CompileOptions.AutoProfile = config.AutoProfile;
            wxToolConfig.CompileOptions.ScriptOnly = config.ScriptOnly;
            wxToolConfig.CompileOptions.Il2CppOptimizeSize = config.Il2CppOptimizeSize;
            wxToolConfig.CompileOptions.profilingFuncs = config.ProfilingFuncs;
            wxToolConfig.CompileOptions.Webgl2 = config.Webgl2;
            wxToolConfig.CompileOptions.DeleteStreamingAssets = config.ClearStreamingAssets;
            wxToolConfig.CompileOptions.ProfilingMemory = config.ProfilingMemory;
            wxToolConfig.CompileOptions.CleanBuild = config.CleanBuild;
            wxToolConfig.CompileOptions.CustomNodePath = config.CustomNodePath;

            EditorUtility.SetDirty(wxToolConfig);
            AssetDatabase.SaveAssets();
            Debug.Log("调用微信工具发布...");
            WXConvertCore.DoExport();

            var miniGameProj = $"{wxToolConfig.ProjectConf.DST}/minigame";
            //复制typhoon-unity-wx.js
            {
                var from = $"Assets/Typhoon_Gen/TyphoonSDK/Runtime/WxMini/Editor/typhoon-unity-wx.js";
                var to = $"{miniGameProj}/{Path.GetFileName(from)}";
                Debug.Log($"复制{from}->{to}");
                File.Copy(from, to, true);
            }

            //复制typhoon-mini-sdk-wx.js
            {
                var from = $"Assets/Typhoon_Gen/TyphoonSDK/Runtime/WxMini/Editor/typhoon-mini-sdk-wx.js";
                var to = $"{miniGameProj}/{Path.GetFileName(from)}";
                Debug.Log($"复制{from}->{to}");
                File.Copy(from, to, true);
            }


            {
                //写入typhoon-mini-sdk-config.js
                var from = $"Assets/Typhoon_Gen/TyphoonSDK/Runtime/WxMini/Editor/typhoon-mini-sdk-config.js";
                var to = $"{miniGameProj}/{Path.GetFileName(from)}";
                var code = File.ReadAllText(from);
                code = code.Replace("$BANNER_AD_UNIT$", config.BannerAdUnit);
                code = code.Replace("$INTERS_AD_UNIT$", config.IntersAdUnit);
                code = code.Replace("$VIDEO_AD_UNIT$", config.VideoAdUnit);
                Debug.Log($"写入{to}");
                File.WriteAllText(to, code);
            }

            {
                //写入game.js
                var game_js = $"{miniGameProj}/game.js";
                var code = File.ReadAllText(game_js);
                var sb = new StringBuilder(code);
                var content =
                    "import './typhoon-mini-sdk-config.js';\nimport './typhoon-mini-sdk-wx.js';\nimport './typhoon-unity-wx.js';\n";
                sb.AppendLine(content);
                Debug.Log($"写入{game_js}");
                File.WriteAllText(game_js, sb.ToString());
            }

            var webgl = $"{wxToolConfig.ProjectConf.DST}/webgl";
            var copyTo = $"{wxToolConfig.ProjectConf.DST}/cdn_res/{Path.GetFileName(wxToolConfig.ProjectConf.CDN)}";
            Debug.Log($"复制cdn资源，到目录...{copyTo}");
            UniEditor.CopyFolder(webgl, copyTo);
            EditorUtility.RevealInFinder(copyTo);
            //补充代码
        }
    }
}