using System;
using System.Text.RegularExpressions;

namespace FoxxRecovery.Materials
{
    public static class FoxxShaderPolicy
    {
        public const string PlaceholderPrefix = "Hidden/FoxxRecovery/";

        public static string ReadShaderName(string text)
        {
            Match match = Regex.Match(text ?? "", "\\bShader\\s+\"([^\"]+)\"");
            string name = match.Success ? match.Groups[1].Value : "";
            if (name.StartsWith(PlaceholderPrefix, StringComparison.Ordinal))
            {
                int separator = name.IndexOf('/', PlaceholderPrefix.Length);
                if (separator >= 0) return name.Substring(separator + 1);
            }
            return name;
        }

        public static bool IsPlaceholder(string text)
        {
            return string.IsNullOrWhiteSpace(text) ||
                text.IndexOf("DummyShaderTextExporter", StringComparison.OrdinalIgnoreCase) >= 0 ||
                text.IndexOf("SubShader", StringComparison.Ordinal) < 0 ||
                (text.IndexOf("GpuProgramID", StringComparison.Ordinal) >= 0 &&
                 text.IndexOf("CGPROGRAM", StringComparison.Ordinal) < 0 && text.IndexOf("HLSLPROGRAM", StringComparison.Ordinal) < 0);
        }

        public static bool IsSpecialEffect(string name, string text)
        {
            name = name ?? "";
            foreach (string marker in new[] { "particle", "screen", "overlay", "grabpass", "distortion", "hologram", "/motion" })
                if (name.IndexOf(marker, StringComparison.OrdinalIgnoreCase) >= 0) return true;
            if (name.IndexOf("poiyomi", StringComparison.OrdinalIgnoreCase) >= 0) return false;
            foreach (string marker in new[] { "_ScreenOverlay", "_Aberration", "_GrabTexture", "_RenderTexture" })
                if ((text ?? "").IndexOf(marker, StringComparison.Ordinal) >= 0) return true;
            return false;
        }

        public static bool CanUsePoiyomi(string name, string materialText, string shaderText)
        {
            if (IsSpecialEffect(name, string.IsNullOrEmpty(shaderText) ? materialText : shaderText)) return false;
            return (name ?? "").IndexOf("poiyomi", StringComparison.OrdinalIgnoreCase) >= 0 ||
                (HasProperty(materialText, "_MainTex") && HasProperty(materialText, "_Color"));
        }

        private static bool HasProperty(string text, string name)
        {
            return Regex.IsMatch(text ?? "", @"(?m)^\s*(?:-\s*)?" + Regex.Escape(name) + @"\s*:");
        }
    }
}
