use super::{RuleConfigurability, RuleDefaultSeverity, RuleDefinition, RuleLanguage, RuleStatus};

pub(crate) const RULE_DEFINITIONS: &[RuleDefinition] = &[
    RuleDefinition {
        id: "comment_style_title_case",
        language: RuleLanguage::Common,
        family: "comments",
        default_severity: RuleDefaultSeverity::Info,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Heading-like Title Case documentation.",
        binding_location: super::bindings::COMMENTS,
    },
    RuleDefinition {
        id: "comment_style_tutorial",
        language: RuleLanguage::Common,
        family: "comments",
        default_severity: RuleDefaultSeverity::Info,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Tutorial-style documentation that narrates obvious implementation steps.",
        binding_location: super::bindings::COMMENTS,
    },
    RuleDefinition {
        id: "hallucinated_import_call",
        language: RuleLanguage::Common,
        family: "hallucination",
        default_severity: RuleDefaultSeverity::Warning,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Package-qualified calls that do not match locally indexed symbols for the imported package.",
        binding_location: super::bindings::HALLUCINATION,
    },
    RuleDefinition {
        id: "hallucinated_local_call",
        language: RuleLanguage::Common,
        family: "hallucination",
        default_severity: RuleDefaultSeverity::Warning,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Same-package calls to symbols not present in the scanned local package context.",
        binding_location: super::bindings::HALLUCINATION,
    },
    RuleDefinition {
        id: "generic_name",
        language: RuleLanguage::Common,
        family: "naming",
        default_severity: RuleDefaultSeverity::Info,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Function names that are overly generic without stronger contextual signals.",
        binding_location: super::bindings::NAMING,
    },
    RuleDefinition {
        id: "overlong_name",
        language: RuleLanguage::Common,
        family: "naming",
        default_severity: RuleDefaultSeverity::Info,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Very long identifiers with too many descriptive tokens.",
        binding_location: super::bindings::NAMING,
    },
    RuleDefinition {
        id: "weak_typing",
        language: RuleLanguage::Common,
        family: "naming",
        default_severity: RuleDefaultSeverity::Info,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Signatures that rely on any or empty interface types.",
        binding_location: super::bindings::NAMING,
    },
    RuleDefinition {
        id: "hardcoded_secret",
        language: RuleLanguage::Common,
        family: "security",
        default_severity: RuleDefaultSeverity::Warning,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Secret-like identifiers assigned direct string literals instead of environment lookups.",
        binding_location: super::bindings::SHARED_SECURITY,
    },
    RuleDefinition {
        id: "happy_path_only_test",
        language: RuleLanguage::Common,
        family: "test_quality",
        default_severity: RuleDefaultSeverity::Info,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Tests that assert success expectations without any obvious negative-path signal.",
        binding_location: super::bindings::TEST_QUALITY,
    },
    RuleDefinition {
        id: "placeholder_test_body",
        language: RuleLanguage::Common,
        family: "test_quality",
        default_severity: RuleDefaultSeverity::Info,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Tests that look skipped, TODO-shaped, or otherwise placeholder-like.",
        binding_location: super::bindings::TEST_QUALITY,
    },
    RuleDefinition {
        id: "test_without_assertion_signal",
        language: RuleLanguage::Common,
        family: "test_quality",
        default_severity: RuleDefaultSeverity::Info,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Tests that exercise production code without an obvious assertion or failure signal.",
        binding_location: super::bindings::TEST_QUALITY,
    },
];
