using UnityEditor;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using UnityEngine;

namespace BansheeGz.BGDatabase.Editor
{
    /// <summary>
    /// If database asset is saved with JSON format, switches it to binary format
    /// </summary>
    public class BGDatabaseSwitchFormatOnBuild : IPreprocessBuildWithReport
    {
        private static BGAddonSettings.FormatEnum originalFormat;
        public int callbackOrder => 0;

        //----------------------- Pre build
        public void OnPreprocessBuild(BuildReport report)
        {
            if (!BGRepo.DefaultRepoLoaded) BGRepo.Load();
            if (!BGRepo.Ok) Debug.Log("Warning! Can not switch database format from JSON to binary, cause database can not be loaded!");
            else
            {
                var addon = BGRepo.I.Addons.Get<BGAddonSettings>();
                if (addon == null || addon.Format == BGAddonSettings.FormatEnum.Binary) return;
                originalFormat = addon.Format; 
                addon.Format = BGAddonSettings.FormatEnum.Binary;
                BGRepoSaver.SaveAndMarkAsSaved();
                EditorApplication.update += WaitForBuildCompletion;
            }
        }

        //----------------------- Post build
        //We need this since IPostprocessBuildWithReport is not fired if the build fails, see: https://discussions.unity.com/t/791031
        private static void WaitForBuildCompletion()
        {
            if (BuildPipeline.isBuildingPlayer) return;
            EditorApplication.update -= WaitForBuildCompletion;
            if (!BGRepo.Ok) return;
            var addon = BGRepo.I.Addons.Get<BGAddonSettings>();
            if (addon?.Format != BGAddonSettings.FormatEnum.Binary) return;
            addon.Format = originalFormat;
            BGRepoSaver.SaveAndMarkAsSaved();
        }
    }
}