using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using UnityEditor;

namespace VitDeck.Validator
{
    /// <summary>
    /// アセット内のテクスチャが指定された圧縮形式になっていることを確認する。
    /// </summary>
    public class TextureImporterFormatRule : BaseRule
    {
        private static readonly Regex AutoGeneratedReflectionProbeTextureNamePattern = new Regex(@"ReflectionProbe-[0-9]+\.exr");

        private readonly string platform;
        private readonly IEnumerable<TextureImporterFormat> importerFormats;

        public TextureImporterFormatRule(string name, string platform, IEnumerable<TextureImporterFormat> importerFormats) : base(name)
        {
            this.platform = platform;
            this.importerFormats = importerFormats;
        }

        protected override void Logic(ValidationTarget target)
        {
            if (platform == "Android" && EditorUserBuildSettings.androidBuildSubtarget != MobileTextureSubtarget.Generic)
            {
                // Androidビルド設定でテクスチャ圧縮形式が指定されていると、テクスチャ毎のインポート設定が無視される
                AddIssue(new Issue(
                    null,
                    IssueLevel.Error,
                    string.Format("ビルド設定のTexture Compressionで、フォーマットの上書きが有効になっています。", platform),
                    string.Format("ビルド設定のTexture Compressionで、「Don't override」(上書きしない) を選択してください。", platform)));
            }

            var autoGeneratedFolderPaths = target.GetScenes()
                .Select(scene => Path.Combine(Path.GetDirectoryName(scene.path), Path.GetFileNameWithoutExtension(scene.path)));

            var pathPrefix = target.GetBaseFolderPath() + "/";
            var paths = target.GetAllAssetPaths().Where(path =>
                !(autoGeneratedFolderPaths.Contains(Path.GetDirectoryName(path))
                    && AutoGeneratedReflectionProbeTextureNamePattern.IsMatch(Path.GetFileName(path)))
                && path.StartsWith(pathPrefix)
            ).Distinct();
            foreach (var path in paths)
            {
                LogicForPath(path);
            }
        }

        private void LogicForPath(string path)
        {
            var importer = AssetImporter.GetAtPath(path) as TextureImporter;
            if (importer == null)
            {
                return;
            }

            var settings = importer.GetPlatformTextureSettings(platform);
            if (!settings.overridden) {
                AddIssue(new Issue(
                    AssetDatabase.LoadMainAssetAtPath(path),
                    IssueLevel.Error,
                    string.Format("テクスチャの{0}プラットフォームのOverrideが無効になっています。", platform),
                    string.Format("テクスチャのインポート設定で、{0}プラットフォームのOverrideへチェックを入れてください。", platform)));
            }

            if (!importerFormats.Contains(settings.format))
            {
                AddIssue(new Issue(
                    AssetDatabase.LoadMainAssetAtPath(path),
                    IssueLevel.Error,
                    string.Format("テクスチャの{0}プラットフォームの圧縮フォーマットが{1}になっています。", platform, settings.format),
                    string.Format("[{0}] のいずれかを選択してください。", string.Join(", ", importerFormats))));
            }
        }
    }
}
