using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Reflection;

namespace Unity.VisualScripting
{
    public abstract class Plugin
    {
        protected Plugin()
        {
            id = PluginContainer.GetPluginID(GetType());
            if (PluginContainer.pluginDependencies != null)
                dependencies = PluginContainer.pluginDependencies[id].Select(PluginContainer.GetPlugin).ToList().AsReadOnly();
        }

        public string id { get; }
        public ReadOnlyCollection<Plugin> dependencies { get; }

        public PluginManifest manifest { get; internal set; }
        public PluginConfiguration configuration { get; internal set; }
        public PluginPaths paths { get; internal set; }
        public PluginResources resources { get; internal set; }

        public virtual IEnumerable<ScriptReferenceReplacement> scriptReferenceReplacements => Enumerable.Empty<ScriptReferenceReplacement>();

        public virtual IEnumerable<object> aotStubs => Enumerable.Empty<object>();

        public virtual IEnumerable<string> tips => Enumerable.Empty<string>();

        public virtual IEnumerable<Page> SetupWizardPages()
        {
            return Enumerable.Empty<Page>();
        }

        public Assembly editorAssembly => GetType().Assembly;

        public Assembly runtimeAssembly
        {
            get
            {
                return Codebase.ludiqRuntimeAssemblies.Single(a => a.GetName().Name == GetType().GetAttribute<PluginRuntimeAssemblyAttribute>().assemblyName);
            }
        }

        public virtual void RunAction() { }
    }
}