<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ phpmd.xml
  ~ Copyright (c) 2023 james@firefly-iii.org
  ~
  ~ This file is part of Firefly III (https://github.com/firefly-iii).
  ~
  ~ This program is free software: you can redistribute it and/or modify
  ~ it under the terms of the GNU Affero General Public License as
  ~ published by the Free Software Foundation, either version 3 of the
  ~ License, or (at your option) any later version.
  ~
  ~ This program is distributed in the hope that it will be useful,
  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  ~ GNU Affero General Public License for more details.
  ~
  ~ You should have received a copy of the GNU Affero General Public License
  ~ along with this program.  If not, see <https://www.gnu.org/licenses/>.
  -->

<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         name="pcsg-generated-ruleset"
         xmlns="http://pmd.sf.net/ruleset/1.0.0"
         xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
         xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
    <description>Firefly III ruleset.</description>
    <!-- Import the entire controversial code rule set -->
    <rule ref="rulesets/controversial.xml">
        <exclude name="CamelCasePropertyName"/>
    </rule>

    <!-- clean code -->
    <!-- <rule ref="rulesets/codesize.xml" /> -->
    <rule ref="rulesets/unusedcode.xml"/>


    <rule ref="rulesets/design.xml/NumberOfChildren">
        <properties>
            <!-- This is now at 32, which excludes the controllers but should prevent more monoliths. -->
            <property name="minimum" value="32"/>
        </properties>
    </rule>
    <rule ref="rulesets/design.xml/CouplingBetweenObjects">
        <properties>
            <!-- Leaving this at 28 excuses most current code but it can't get worse than that. -->
            <property name="maximum" value="28"/>
        </properties>
    </rule>


    <rule ref="rulesets/naming.xml/ShortMethodName">
        <properties>
            <property name="minimum" value="3"/>
        </properties>
    </rule>

    <!-- code size -->
    <rule ref="rulesets/codesize.xml/CyclomaticComplexity">
        <properties>
            <!-- Leave at 20. This means methods will be pretty complex before the system starts complaining. -->
            <property name="reportLevel" value="20"/>
        </properties>
    </rule>
    <rule ref="rulesets/codesize.xml/NPathComplexity">
        <properties>
            <!-- 2000 results in some pretty complex methods, but it's OK. -->
            <!-- They should not be much more complex than that though -->
            <property name="minimum" value="2000"/>
        </properties>
    </rule>
    <rule ref="rulesets/codesize.xml/ExcessiveMethodLength">
        <properties>
            <!-- 75 seems like a nice number. Shorter isn't always feasible and there are a few exceptions already -->
            <property name="minimum" value="75"/>
            <property name="ignore-whitespace" value="true"/>
        </properties>
    </rule>
    <rule ref="rulesets/codesize.xml/ExcessiveParameterList">
        <properties>
            <!-- 5 is fine. 6 is excessive, but I have just one of those. At the end of the day, I still need all params. -->
            <property name="minimum" value="5"/>
        </properties>
    </rule>

    <!-- include clean code manually -->
    <rule ref="rulesets/cleancode.xml/BooleanArgumentFlag"/>
    <rule ref="rulesets/cleancode.xml/ElseExpression"/>
    <rule ref="rulesets/cleancode.xml/MissingImport"/>
    <rule ref="rulesets/cleancode.xml/UndefinedVariable"/>
    <rule ref="rulesets/cleancode.xml/IfStatementAssignment"/>
    <rule ref="rulesets/cleancode.xml/DuplicatedArrayKey"/>
    <rule ref="rulesets/cleancode.xml/ErrorControlOperator"/>
</ruleset>
