#pragma warning disable 162

using System.IO;
using UnityEngine;

namespace Unity.VisualScripting
{
    [PluginModule(required = true)]
    public class PluginPaths : IPluginModule
    {
        protected PluginPaths(Plugin plugin)
        {
            this.plugin = plugin;
        }

        public virtual void Initialize()
        {
            if (isFirstPass)
            {
                Debug.LogWarning($"Plugin '{plugin.id}' is in a special folder that makes it compile first.\nThis might cause issues with generated assets.");
            }
        }

        public virtual void LateInitialize() { }

        public Plugin plugin { get; }

        private static string _package;

        // Note: The Bolt 'package' can exist within the Assets folder OR within the Packages folder in a project, depending on
        // when we release Bolt as a package / what the user has set up in an existing project.
        public static string package
        {
            get
            {
                if (_package == null)
                {
                    _package = PathUtility.GetPackageRootPath();
                }

                return _package;
            }
        }

        public const string FOLDER_BOLT_GENERATED = "Unity.VisualScripting.Generated";
        public static string ASSETS_FOLDER_BOLT_GENERATED = Path.Combine("Assets", FOLDER_BOLT_GENERATED);

        public bool isFirstPass => package.Contains("/Plugins/") || package.Contains("/Standard Assets/") || package.Contains("/Pro Standard Assets/");

        public static string resourcesFolder => Path.Combine(package, $"Editor/VisualScripting.Core/EditorAssetResources");

        internal const string assetBundleRoot = "Assets/EditorResources";

        internal const string assetBundle = "visualscripting.editor_assets";

        public static string resourcesBundle = Path.Combine(package, $"Editor/VisualScripting.Core/EditorAssetResources/{assetBundle}");

        public static string generated => Path.Combine(Paths.assets, FOLDER_BOLT_GENERATED);

        public string persistentGenerated => Path.Combine(generated, plugin.id);

        public string transientGenerated => Path.Combine(generated, plugin.id);

        public static string projectSettings => Path.Combine(Paths.project, "ProjectSettings", "VisualScriptingSettings.asset");
    }
}