Checks:
  - readability-*
  - modernize-*
  - performance-*
  - bugprone-*
  - -readability-identifier-length
  - -readability-magic-numbers
  - -bugprone-integer-division
  - -bugprone-easily-swappable-parameters
  - -bugprone-narrowing-conversions
  - -modernize-avoid-c-arrays,-warnings-as-errors

WarningsAsErrors: '*'
# Solo headers del propio código fuente (external/ y spv/ tienen su propio .clang-tidy dummy)
HeaderFilterRegex: 'source/.*'
FormatStyle: file

CheckOptions:
  # bugprone-empty-catch: aceptar catches vacíos marcados con @INTENTIONAL en un comentario
  - { key: bugprone-empty-catch.IgnoreCatchWithKeywords, value: '@INTENTIONAL' }

  # Variables locales en snake_case
  - { key: readability-identifier-naming.VariableCase, value: lower_case }

  # Miembros privados en snake_case con sufijo _
  - { key: readability-identifier-naming.PrivateMemberCase, value: lower_case }
  - { key: readability-identifier-naming.PrivateMemberSuffix, value: _ }

  # Miembros protegidos en snake_case con sufijo _
  - { key: readability-identifier-naming.ProtectedMemberCase, value: lower_case }
  - { key: readability-identifier-naming.ProtectedMemberSuffix, value: _ }

  # Miembros públicos en snake_case (sin sufijo)
  - { key: readability-identifier-naming.PublicMemberCase, value: lower_case }

  # Namespaces en CamelCase
  - { key: readability-identifier-naming.NamespaceCase, value: CamelCase }

  # Variables estáticas privadas como miembros privados
  - { key: readability-identifier-naming.StaticVariableCase, value: lower_case }
  - { key: readability-identifier-naming.StaticVariableSuffix, value: _ }

  # Constantes estáticas sin sufijo
  - { key: readability-identifier-naming.StaticConstantCase, value: UPPER_CASE }

  # Constantes globales en UPPER_CASE
  - { key: readability-identifier-naming.GlobalConstantCase, value: UPPER_CASE }

  # Variables constexpr globales en UPPER_CASE
  - { key: readability-identifier-naming.ConstexprVariableCase, value: UPPER_CASE }

  # Constantes locales en UPPER_CASE
  - { key: readability-identifier-naming.LocalConstantCase, value: UPPER_CASE }

  # Constexpr miembros en UPPER_CASE (sin sufijo)
  - { key: readability-identifier-naming.ConstexprMemberCase, value: UPPER_CASE }

  # Constexpr miembros privados/protegidos con sufijo _
  - { key: readability-identifier-naming.ConstexprMethodCase, value: UPPER_CASE }

  # Clases, structs y enums en CamelCase
  - { key: readability-identifier-naming.ClassCase, value: CamelCase }
  - { key: readability-identifier-naming.StructCase, value: CamelCase }
  - { key: readability-identifier-naming.EnumCase, value: CamelCase }

  # Valores de enums en UPPER_CASE
  - { key: readability-identifier-naming.EnumConstantCase, value: UPPER_CASE }

  # Métodos en camelBack (sin sufijos)
  - { key: readability-identifier-naming.MethodCase, value: camelBack }
  - { key: readability-identifier-naming.PrivateMethodCase, value: camelBack }
  - { key: readability-identifier-naming.ProtectedMethodCase, value: camelBack }
  - { key: readability-identifier-naming.PublicMethodCase, value: camelBack }

  # Funciones en camelBack
  - { key: readability-identifier-naming.FunctionCase, value: camelBack }

  # Parámetros en lower_case
  - { key: readability-identifier-naming.ParameterCase, value: lower_case }
