using System.Collections.Generic;
using System.IO;
using UnityEditor.AddressableAssets.Settings;

namespace UnityEditor.AddressableAssets.Build.AnalyzeRules
{
    /// <summary>
    /// Rule class to check resource dependencies for duplicates
    /// </summary>
    public class CheckResourcesDupeDependencies : BundleRuleBase
    {
        /// <inheritdoc />
        public override string ruleName
        {
            get { return "Check Resources to Addressable Duplicate Dependencies"; }
        }

        /// <inheritdoc />
        public override bool CanFix
        {
            get { return false; }
        }

        /// <summary>
        /// Clear analysis and calculate built in resources and corresponding bundle dependencies
        /// </summary>
        /// <param name="settings">The current Addressables settings object</param>
        /// <returns>List of results from analysis</returns>
        public override List<AnalyzeResult> RefreshAnalysis(AddressableAssetSettings settings)
        {
            ClearAnalysis();
            AddressableAnalytics.ReportUsageEvent(AddressableAnalytics.UsageEventType.RunCheckResourcesDupeDependenciesRule);
            return CalculateBuiltInResourceDependenciesToBundleDependecies(settings, GetResourcePaths());
        }

        /// <inheritdoc />
        public override void FixIssues(AddressableAssetSettings settings)
        {
            //Do nothing.  There's nothing to fix.
        }

        /// <inheritdoc />
        internal protected override string[] GetResourcePaths()
        {
            string[] resourceDirectory = Directory.GetDirectories("Assets", "Resources", SearchOption.AllDirectories);
            List<string> resourcePaths = new List<string>();
            foreach (string directory in resourceDirectory)
                resourcePaths.AddRange(Directory.GetFiles(directory, "*", SearchOption.AllDirectories));
            return resourcePaths.ToArray();
        }
    }


    [InitializeOnLoad]
    class RegisterCheckResourcesDupeDependencies
    {
        static RegisterCheckResourcesDupeDependencies()
        {
            AnalyzeSystem.RegisterNewRule<CheckResourcesDupeDependencies>();
        }
    }
}