// Asset Naming Manager — https://assetstore.unity.com
// Copyright (c) 2026. All rights reserved.

namespace AssetNamingManager
{
    /// <summary>How loudly the Cop complains about a broken rule.</summary>
    public enum NamingSeverity
    {
        /// <summary>Informational only. Never fails CI, shown in blue.</summary>
        Info = 0,

        /// <summary>Should be fixed, but will not block a build. Shown in amber.</summary>
        Warning = 1,

        /// <summary>Must be fixed. Fails CI when the gate is set to <see cref="Error"/>. Shown in red.</summary>
        Error = 2
    }

    /// <summary>The casing style a name (or the body of a name after its prefix) must follow.</summary>
    public enum NamingConvention
    {
        /// <summary>No casing requirement at all.</summary>
        Any = 0,

        /// <summary>PlayerRunCycle</summary>
        PascalCase = 1,

        /// <summary>playerRunCycle</summary>
        CamelCase = 2,

        /// <summary>player_run_cycle</summary>
        SnakeCase = 3,

        /// <summary>PLAYER_RUN_CYCLE</summary>
        ScreamingSnakeCase = 4,

        /// <summary>player-run-cycle</summary>
        KebabCase = 5,

        /// <summary>Player_Run_Cycle — PascalCase words joined with underscores. Very common for art.</summary>
        PascalSnakeCase = 6
    }

    /// <summary>The specific problem the Cop found on one asset.</summary>
    public enum ViolationKind
    {
        /// <summary>The file name does not start with the prefix the rule demands.</summary>
        MissingPrefix = 0,

        /// <summary>The file name does not end with the suffix the rule demands.</summary>
        MissingSuffix = 1,

        /// <summary>The name body does not match the required casing convention.</summary>
        ConventionMismatch = 2,

        /// <summary>The name contains a character that is banned project-wide (space, %, #, and friends).</summary>
        IllegalCharacter = 3,

        /// <summary>The asset lives outside every folder the rule allows.</summary>
        WrongFolder = 4,

        /// <summary>The asset lives inside a folder the rule explicitly forbids.</summary>
        ForbiddenFolder = 5,

        /// <summary>Another asset somewhere else has the same name, ignoring case.</summary>
        DuplicateName = 6,

        /// <summary>The name is longer than the rule allows.</summary>
        TooLong = 7,

        /// <summary>The name is shorter than the rule allows.</summary>
        TooShort = 8,

        /// <summary>The name failed (or wrongly passed) the rule's custom regular expression.</summary>
        RegexMismatch = 9,

        /// <summary>The name contains junk words such as "copy", "final", "new", "test", "temp".</summary>
        RedundantToken = 10,

        /// <summary>A trailing number is not zero padded to the configured width (Run_1 instead of Run_01).</summary>
        NumberPadding = 11,

        /// <summary>The asset is sitting loose in the Assets root instead of a category folder.</summary>
        LooseInRoot = 12,

        /// <summary>A folder contains no assets at all.</summary>
        EmptyFolder = 13,

        /// <summary>A folder name breaks the folder naming convention.</summary>
        FolderNaming = 14,

        /// <summary>The full asset path is long enough to break builds on Windows.</summary>
        PathTooLong = 15
    }

    /// <summary>How the violation list is bucketed in the window.</summary>
    public enum GroupMode
    {
        None = 0,
        Rule = 1,
        Folder = 2,
        AssetType = 3,
        Severity = 4,
        Problem = 5
    }

    /// <summary>How strict the duplicate-name check is.</summary>
    public enum DuplicateScope
    {
        /// <summary>Flag any two assets whose file names match, even across different types.</summary>
        NameOnly = 0,

        /// <summary>Flag only when the file names AND extensions match. Sensible default.</summary>
        NameAndExtension = 1,

        /// <summary>Flag only when the file names match and both assets are the same Unity type.</summary>
        NameAndType = 2
    }

    /// <summary>Which file format <see cref="ReportExporter"/> should write.</summary>
    public enum ReportFormat
    {
        Csv = 0,
        Json = 1,
        Markdown = 2,
        Html = 3
    }
}
