<?xml version="1.0"?>
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="PHP_CodeSniffer" xsi:noNamespaceSchemaLocation="phpcs.xsd">
    <description>Coding Standard</description>

    <file>app</file>
    <file>config</file>
    <file>public</file>
    <file>resources</file>
    <file>routes</file>

    <arg name="basepath" value="."/>
    <arg name="colors"/>
    <arg name="parallel" value="75"/>
    <arg value="spv"/>
    <ini name="memory_limit" value="128M"/>

    <rule ref="Generic.Classes.DuplicateClassName">
        <exclude name="Generic.CodeAnalysis.EmptyStatement.DetectedIf"/>
    </rule>
    <rule ref="Generic.CodeAnalysis.EmptyStatement"/>
    <rule ref="Generic.CodeAnalysis.ForLoopShouldBeWhileLoop"/>
    <rule ref="Generic.CodeAnalysis.ForLoopWithTestFunctionCall"/>
    <rule ref="Generic.CodeAnalysis.JumbledIncrementer"/>
    <rule ref="Generic.CodeAnalysis.UnconditionalIfStatement"/>
    <rule ref="Generic.CodeAnalysis.UnnecessaryFinalModifier"/>
    <rule ref="Generic.CodeAnalysis.UnusedFunctionParameter">
        <exclude-pattern>/app/Http/Resources/*\.php</exclude-pattern>
    </rule>
    <rule ref="Generic.CodeAnalysis.UselessOverridingMethod"/>
    <rule ref="Generic.Commenting.DocComment">
        <exclude name="Generic.Commenting.DocComment.TagValueIndent"/>
        <exclude name="Generic.Commenting.DocComment.NonParamGroup"/>
    </rule>
    <rule ref="Generic.ControlStructures.InlineControlStructure"/>
    <rule ref="Generic.Files.ByteOrderMark"/>
    <rule ref="Generic.Files.LineEndings">
        <exclude name="Generic.Files.LineEndings.InvalidEOLChar"/>
    </rule>
    <rule ref="Generic.Formatting.DisallowMultipleStatements"/>
    <rule ref="Generic.Formatting.SpaceAfterCast"/>
    <rule ref="Generic.Functions.FunctionCallArgumentSpacing"/>
    <rule ref="Generic.Functions.OpeningFunctionBraceBsdAllman"/>
    <rule ref="Generic.Metrics.CyclomaticComplexity">
        <properties>
            <property name="complexity" value="20"/>
            <property name="absoluteComplexity" value="50"/>
        </properties>
    </rule>
    <rule ref="Generic.Metrics.NestingLevel">
        <properties>
            <property name="nestingLevel" value="5"/>
            <property name="absoluteNestingLevel" value="15"/>
        </properties>
    </rule>
    <rule ref="Generic.NamingConventions.ConstructorName"/>
    <rule ref="Generic.PHP.LowerCaseConstant"/>
    <rule ref="Generic.PHP.DeprecatedFunctions"/>
    <rule ref="Generic.PHP.DisallowShortOpenTag"/>
    <rule ref="Generic.PHP.ForbiddenFunctions"/>
    <rule ref="Generic.PHP.NoSilencedErrors"/>
    <rule ref="Generic.WhiteSpace.DisallowTabIndent"/>
    <rule ref="Generic.WhiteSpace.ScopeIndent">
        <properties>
            <property name="indent" value="4"/>
            <property name="tabIndent" value="true"/>
        </properties>
    </rule>
    <rule ref="PSR1.Classes.ClassDeclaration"/>
    <rule ref="PSR1.Files.SideEffects"/>
    <rule ref="PSR2.Classes.ClassDeclaration"/>
    <rule ref="PSR2.Classes.PropertyDeclaration"/>
    <rule ref="PSR2.ControlStructures.ElseIfDeclaration"/>
    <rule ref="PSR2.ControlStructures.SwitchDeclaration"/>
    <rule ref="PSR2.Files.EndFileNewline"/>
    <rule ref="PSR2.Methods.MethodDeclaration"/>
    <rule ref="PSR2.Namespaces.NamespaceDeclaration"/>
    <rule ref="PSR2.Namespaces.UseDeclaration"/>
    <rule ref="PSR1">
        <exclude-pattern>*.php</exclude-pattern>
        <exclude name="PSR1.Methods.CamelCapsMethodName.NotCamelCaps"/>

        <exclude-pattern>database/*</exclude-pattern>
    </rule>
    <rule ref="PSR2">
        <exclude name="PSR2.ControlStructures.SwitchDeclaration.BodyOnNextLineCASE" />
    </rule>
    <rule ref="Squiz.Arrays.ArrayDeclaration">
        <exclude name="Squiz.Arrays.ArrayDeclaration.ValueNotAligned" />
        <exclude name="Squiz.Arrays.ArrayDeclaration.KeyNotAligned" />
        <exclude name="Squiz.Arrays.ArrayDeclaration.DoubleArrowNotAligned" />
        <exclude name="Squiz.Arrays.ArrayDeclaration.ValueNotAligned" />
        <exclude name="Squiz.Arrays.ArrayDeclaration.CloseBraceNotAligned" />
        <exclude name="Squiz.Arrays.ArrayDeclaration.ValueNoNewline" />
        <exclude name="Squiz.Arrays.ArrayDeclaration.MultiLineNotAllowed" />
        <exclude name="Squiz.Arrays.ArrayDeclaration.SingleLineNotAllowed" />
        <exclude name="Squiz.Functions.MultiLineFunctionDeclaration.NewlineBeforeOpenBrace" />
        <exclude name="Squiz.Arrays.ArrayDeclaration.NoKeySpecified" />
        <exclude name="Squiz.Arrays.ArrayDeclaration.KeySpecified" />
    </rule>
    <rule ref="Squiz.PHP.DisallowSizeFunctionsInLoops"/>
    <rule ref="Squiz.PHP.DiscouragedFunctions">
        <properties>
            <property name="error" value="true"/>
        </properties>
    </rule>
    <rule ref="Squiz.PHP.Eval"/>
    <rule ref="Squiz.PHP.GlobalKeyword"/>
    <rule ref="Squiz.PHP.LowercasePHPFunctions"/>
    <rule ref="Squiz.PHP.NonExecutableCode"/>
    <rule ref="Squiz.Scope.MemberVarScope"/>
    <rule ref="Squiz.Scope.MethodScope"/>
    <rule ref="Squiz.Scope.StaticThisUsage"/>
    <rule ref="Squiz.WhiteSpace.CastSpacing"/>
    <rule ref="Squiz.WhiteSpace.LogicalOperatorSpacing"/>
    <rule ref="Squiz.WhiteSpace.ObjectOperatorSpacing">
        <properties>
            <property name="ignoreNewlines" value="true"/>
        </properties>
    </rule>
    <rule ref="Squiz.WhiteSpace.OperatorSpacing">
        <properties>
            <property name="ignoreNewlines" value="true"/>
        </properties>
    </rule>
    <rule ref="Squiz.WhiteSpace.ScopeClosingBrace"/>
    <rule ref="Squiz.WhiteSpace.ScopeKeywordSpacing"/>
    <rule ref="Squiz.WhiteSpace.SemicolonSpacing"/>
    <rule ref="Zend.Files.ClosingTag"/>
    <rule ref="PSR2.ControlStructures.ControlStructureSpacing"/>

    <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace.EndLine">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Generic.Commenting.DocComment.LongNotCapital">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Generic.WhiteSpace.DisallowTabIndent.NonIndentTabsUsed">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Generic.Files.LineLength.TooLong">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Generic.CodeAnalysis.UselessOverridingMethod.Found">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Generic.Formatting.SpaceAfterCast.NoSpace">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Squiz.WhiteSpace.ControlStructureSpacing.SpacingAfterOpen">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Squiz.WhiteSpace.OperatorSpacing.NoSpaceBefore">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Squiz.WhiteSpace.OperatorSpacing.NoSpaceAfter">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="PSR2.Files.EndFileNewline.NoneFound">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="PSR2.Methods.FunctionClosingBrace.SpacingBeforeClose">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="PSR2.Namespaces.UseDeclaration.SpaceAfterLastUse">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Squiz.WhiteSpace.ControlStructureSpacing.SpacingAfterOpen">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Generic.WhiteSpace.DisallowTabIndent.TabsUsed">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Generic.CodeAnalysis.EmptyStatement.DetectedCatch">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Squiz.ControlStructures.ControlSignature.SpaceAfterCloseParenthesis">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Squiz.ControlStructures.ControlSignature.NewlineAfterOpenBrace">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Squiz.WhiteSpace.ScopeClosingBrace.ContentBefore">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Squiz.WhiteSpace.ControlStructureSpacing.SpacingBeforeClose">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="PSR2.Files.EndFileNewline.TooMany">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Generic.Metrics.NestingLevel.TooHigh">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Squiz.Arrays.ArrayDeclaration.CloseBraceNewLine">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Generic.Metrics.CyclomaticComplexity.TooHigh">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Generic.CodeAnalysis.EmptyStatement.DetectedElseif">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="PSR2.Methods.FunctionCallSignature.MultipleArguments">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Squiz.PHP.DisallowSizeFunctionsInLoops.Found">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="PSR2.Methods.FunctionCallSignature.SpaceBeforeCloseBracket">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Generic.Commenting.DocComment.ShortNotCapital">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Squiz.PHP.NonExecutableCode.Unreachable">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Generic.CodeAnalysis.EmptyStatement.DetectedElse">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Generic.Metrics.CyclomaticComplexity.MaxExceeded">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Generic.CodeAnalysis.UnusedFunctionParameter.Found">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClass">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Generic.PHP.DeprecatedFunctions.Deprecated">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Squiz.WhiteSpace.ScopeClosingBrace.Indent">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Squiz.Arrays.ArrayDeclaration.IndexNoNewline">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="PSR2.Methods.FunctionCallSignature.ContentAfterOpenBracket">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="PSR2.Methods.FunctionCallSignature.CloseBracketLine">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Generic.CodeAnalysis.UnusedFunctionParameter.FoundBeforeLastUsed">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassAfterLastUsed">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Squiz.PHP.DiscouragedFunctions.Found">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed">
        <exclude-pattern>*</exclude-pattern>
    </rule>
    <rule ref="Generic.PHP.NoSilencedErrors.Discouraged">
        <exclude-pattern>*</exclude-pattern>
    </rule>

    <exclude-pattern>*/.phpstorm.meta.php</exclude-pattern>
    <exclude-pattern>*/_ide_helper.php</exclude-pattern>
    <exclude-pattern>*/database/*</exclude-pattern>
    <exclude-pattern>*/cache/*</exclude-pattern>
    <exclude-pattern>*/*.js</exclude-pattern>
    <exclude-pattern>*/*.css</exclude-pattern>
    <exclude-pattern>*/*.xml</exclude-pattern>
    <exclude-pattern>*/*.blade.php</exclude-pattern>
    <exclude-pattern>*/autoload.php</exclude-pattern>
    <exclude-pattern>*/storage/*</exclude-pattern>
    <exclude-pattern>*/docs/*</exclude-pattern>
    <exclude-pattern>*/vendor/*</exclude-pattern>
    <exclude-pattern>*/overrides/*</exclude-pattern>
    <exclude-pattern>*/migrations/*</exclude-pattern>
    <exclude-pattern>*/config/*</exclude-pattern>
    <exclude-pattern>*/public/index.php</exclude-pattern>
    <exclude-pattern>*/*.blade.php</exclude-pattern>
    <exclude-pattern>*/Console/Kernel.php</exclude-pattern>
    <exclude-pattern>*/Exceptions/Handler.php</exclude-pattern>
    <exclude-pattern>*/Http/Kernel.php</exclude-pattern>
    <exclude-pattern>*/Providers/*</exclude-pattern>
    <exclude-pattern>*/resources/lang/*</exclude-pattern>
    <exclude-pattern>*/Modules/*</exclude-pattern>
</ruleset>
