<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
        "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
        "https://checkstyle.org/dtds/configuration_1_3.dtd">

<!--
  Checkstyle X-Adm — padrão cross-project (Java). Copie para
  config/checkstyle/checkstyle.xml (e o suppressions.xml ao lado) no repo do app;
  o gate é `./gradlew check`. NÃO fixe versão de Java aqui (envelhece) — os checks
  abaixo valem em qualquer Java moderno.

  Conjunto MODERADO: pega problemas reais e desvios claros de estilo, sem nitpick de
  formatação (indentação de quebra de linha, espaçamento fino) que geraria ruído num
  código já formatado. Estilo: 4 espaços, ~120 colunas, imports ordenados, sem wildcard.

  Escape: anote `@SuppressWarnings("checkstyle:NomeDoCheck")` num caso pontual justificado.
-->
<module name="Checker">
    <property name="severity" value="error"/>
    <property name="fileExtensions" value="java"/>

    <!-- Arquivo -->
    <module name="NewlineAtEndOfFile"/>
    <module name="FileTabCharacter">
        <property name="eachLine" value="true"/>
    </module>
    <module name="LineLength">
        <property name="max" value="120"/>
        <property name="ignorePattern" value="^package.*|^import.*|^ *\* *@see|href="/>
    </module>

    <module name="SuppressWarningsFilter"/>

    <!-- Exceções pontuais (ex. nomes de método de teste). -->
    <module name="SuppressionFilter">
        <property name="file" value="${config_loc}/suppressions.xml"/>
    </module>

    <module name="TreeWalker">
        <module name="SuppressWarningsHolder"/>

        <!-- Imports -->
        <module name="AvoidStarImport"/>
        <module name="RedundantImport"/>
        <module name="UnusedImports">
            <property name="processJavadoc" value="true"/>
        </module>

        <!-- Convenções de nomes -->
        <module name="PackageName"/>
        <module name="TypeName"/>
        <module name="MethodName"/>
        <module name="MemberName"/>
        <module name="ParameterName"/>
        <module name="LambdaParameterName"/>
        <module name="CatchParameterName">
            <!-- Aceita os defaults (e/t/ex/_, 3+ chars camelCase) + e1/e2/... em try aninhados
                 e abreviações tipo `re` (RuntimeException). -->
            <property name="format" value="^(e|t|ex|re|e[0-9]+|[a-z][a-z][a-zA-Z]+|_)$"/>
        </module>
        <module name="LocalVariableName"/>
        <module name="LocalFinalVariableName"/>
        <module name="ConstantName"/>
        <module name="StaticVariableName"/>
        <module name="ClassTypeParameterName"/>
        <module name="MethodTypeParameterName"/>
        <module name="InterfaceTypeParameterName"/>

        <!-- Blocos e chaves -->
        <module name="NeedBraces">
            <!-- Permite o guard-clause de uma linha (if (x) return;). -->
            <property name="allowSingleLineStatement" value="true"/>
        </module>
        <module name="LeftCurly"/>
        <module name="RightCurly"/>
        <module name="EmptyBlock">
            <property name="option" value="text"/>
            <property name="tokens"
                      value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE,
                             LITERAL_FOR, LITERAL_WHILE, LITERAL_DO, STATIC_INIT, INSTANCE_INIT"/>
        </module>
        <module name="EmptyCatchBlock">
            <property name="commentFormat" value=".*"/>
        </module>

        <!-- Código: problemas reais -->
        <module name="EqualsHashCode"/>
        <module name="StringLiteralEquality"/>
        <module name="SimplifyBooleanExpression"/>
        <module name="SimplifyBooleanReturn"/>
        <module name="EmptyStatement"/>
        <module name="FallThrough"/>
        <module name="MissingSwitchDefault"/>
        <module name="DefaultComesLast"/>
        <module name="OneStatementPerLine"/>
        <module name="MultipleVariableDeclarations"/>
        <module name="UnusedLocalVariable"/>
        <module name="NoFinalizer"/>

        <!-- Modificadores -->
        <module name="ModifierOrder"/>
        <module name="RedundantModifier"/>

        <!-- Estilo geral -->
        <module name="ArrayTypeStyle"/>
        <module name="UpperEll"/>
        <module name="OneTopLevelClass"/>
        <module name="OuterTypeFilename"/>
        <module name="GenericWhitespace"/>
        <module name="WhitespaceAround">
            <property name="allowEmptyConstructors" value="true"/>
            <property name="allowEmptyMethods" value="true"/>
            <property name="allowEmptyTypes" value="true"/>
            <property name="allowEmptyLambdas" value="true"/>
        </module>
    </module>
</module>
