<?xml version="1.0"?>
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="KimaAI WordPress plugin project" xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/squizlabs/PHP_CodeSniffer/master/phpcs.xsd">

    <description>A custom set of rules to check for KimaAI WordPress plugin project</description>

    <!--
      #############################################################################
      COMMAND LINE ARGUMENTS
      https://github.com/squizlabs/PHP_CodeSniffer/wiki/Annotated-Ruleset
      #############################################################################
      -->

    <!-- Set the memory limit to 512M.
           For most standard PHP configurations, this means the memory limit will temporarily be raised.
           Ref: https://github.com/squizlabs/PHP_CodeSniffer/wiki/Advanced-Usage#specifying-phpini-settings
      -->
    <ini name="memory_limit" value="512M"/>

    <file>./app</file>
    <file>./kimaai.php</file>

    <!-- Strip the filepaths down to the relevant bit. -->
    <arg name="basepath" value="."/>

    <!-- Check up to 8 files simultaneously. -->
    <arg name="parallel" value="8"/>


    <!--
      #############################################################################
      SET UP THE RULESETS
      #############################################################################
      -->

    <rule ref="WordPress">
        <!-- We don't want Yoda conditions. -->
        <exclude name="WordPress.PHP.YodaConditions.NotYoda"/>

        <!-- Intentionally different names. -->
        <exclude name="WordPress.Files.FileName.InvalidClassFileName"/>
        <exclude name="WordPress.Files.FileName.NotHyphenatedLowercase"/>

        <!--   Disable Method name "createTables" in class Schema is not in snake case format, try "create_tables"     -->
        <exclude name="WordPress.NamingConventions.ValidFunctionName"/>

        <exclude name="WordPress.WhiteSpace.CastStructureSpacing.NoSpaceBeforeOpenParenthesis"/>
        <exclude name="WordPress.WhiteSpace.CastStructureSpacing.NoSpaceAfterCloseParenthesis"/>

        <exclude name="WordPress.Arrays.ArrayDeclarationSpacing.NoSpaceAfterArrayOpener" />
        <exclude name="WordPress.Arrays.ArrayDeclarationSpacing.NoSpaceBeforeArrayCloser" />
        <exclude name="WordPress.Arrays.ArrayKeySpacingRestrictions.SpacesAroundArrayKeys" />
        <exclude name="WordPress.Arrays.ArrayKeySpacingRestrictions.NoSpacesAroundArrayKeys" />
        <exclude name="WordPress.WhiteSpace.ControlStructureSpacing.NoSpaceBeforeCloseParenthesis"/>
        <exclude name="WordPress.WhiteSpace.ControlStructureSpacing.NoSpaceAfterOpenParenthesis"/>
        <exclude name="WordPress.WhiteSpace.OperatorSpacing.NoSpaceBefore"/>
        <exclude name="WordPress.WhiteSpace.OperatorSpacing.NoSpaceAfter"/>
        <exclude name="Universal.Operators.DisallowShortTernary.Found" />

        <!--        <exclude name="WordPress.NamingConventions.PrefixAllGlobals"/>-->
    </rule>

    <rule ref="WordPress-Core">
        <exclude name="PEAR.Functions.FunctionCallSignature.SpaceAfterOpenBracket" />
        <exclude name="PEAR.Functions.FunctionCallSignature.SpaceBeforeCloseBracket" />
        <exclude name="Squiz.Functions.FunctionDeclarationArgumentSpacing.SpacingAfterOpen" />
        <exclude name="Squiz.Functions.FunctionDeclarationArgumentSpacing.SpacingBeforeClose" />
        <exclude name="NormalizedArrays.Arrays.ArrayBraceSpacing.SpaceAfterArrayOpenerSingleLine" />
        <exclude name="NormalizedArrays.Arrays.ArrayBraceSpacing.SpaceBeforeArrayCloserSingleLine" />
        <exclude name="Generic.Formatting.MultipleStatementAlignment.NotSameWarning"/>
        <exclude name="Generic.WhiteSpace.ArbitraryParenthesesSpacing.SpaceAfterOpen"/>
        <exclude name="Generic.WhiteSpace.ArbitraryParenthesesSpacing.SpaceBeforeClose"/>
    </rule>

    <!-- Include the WordPress-Extra standard. -->
    <rule ref="WordPress-Extra">
        <!--
            We may want a middle ground though. The best way to do this is add the
            entire ruleset, then rule by rule, remove ones that don't suit a project.
            We can do this by running `phpcs` with the '-s' flag, which allows us to
            see the names of the sniffs reporting errors.
            Once we know the sniff names, we can opt to exclude sniffs which don't
            suit our project like so.

            The below two examples just show how you can exclude rules/error codes.
            They are not intended as advice about which sniffs to exclude.
            -->

        <!--
            <exclude name="WordPress.WhiteSpace.ControlStructureSpacing"/>
            <exclude name="Modernize.FunctionCalls.Dirname.Nested"/>
            -->

        <!-- Allow array short syntax. -->
        <exclude name="Universal.Arrays.DisallowShortArraySyntax.Found" />
    </rule>

    <!-- Let's also check that everything is properly documented. -->
    <rule ref="WordPress-Docs"/>

    <!-- Add in some extra rules from other standards. -->
    <rule ref="Generic.Commenting.Todo"/>

    <!-- Forget about file names -->
    <exclude name="WordPress.Files.FileName"/>

    <!-- Enforces camelCase method names   -->
    <rule ref="PSR1.Methods.CamelCapsMethodName"/>

    <!-- Check for PHP cross-version compatibility. -->
    <!--
      To enable this, the PHPCompatibilityWP standard needs
      to be installed.
      See the readme for installation instructions:
      https://github.com/PHPCompatibility/PHPCompatibilityWP
      For more information, also see:
      https://github.com/PHPCompatibility/PHPCompatibility
      -->
    <!--
      <config name="testVersion" value="5.6-"/>
      <rule ref="PHPCompatibilityWP">
          <include-pattern>*\.php</include-pattern>
      </rule>
      -->


    <!--
      #############################################################################
      SNIFF SPECIFIC CONFIGURATION
      #############################################################################
      -->

    <!--
      To get the optimal benefits of using WordPressCS, we should add a couple of
      custom properties.
      Adjust the values of these properties to fit our needs.

      For information on additional custom properties available, check out
      the wiki:
      https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties
      -->
    <config name="minimum_wp_version" value="6.0"/>

    <rule ref="WordPress.WP.I18n">
        <properties>
            <property name="text_domain" type="array">
                <element value="kimaai"/>
            </property>
        </properties>
    </rule>

    <rule ref="WordPress.NamingConventions.PrefixAllGlobals">
        <properties>
            <property name="prefixes" type="array">
                <element value="KimaAI"/>
            </property>
        </properties>
    </rule>


    <!--
      #############################################################################
      SELECTIVE EXCLUSIONS
      Exclude specific files for specific sniffs and/or exclude sub-groups in sniffs.
      #############################################################################
      -->

    <!--
      Sometimes, you may want to exclude a certain directory, like your tests,
      for select sniffs.
      The below examples demonstrate how to do this.

      In the example, the `GlobalVariablesOverride` rule is excluded for test files
      as it is sometimes necessary to overwrite WP globals in test situations (just
      don't forget to restore them after the test!).

      Along the same lines, PHPUnit is getting stricter about using PSR-4 file names,
      so excluding test files from the `WordPress.Files.Filename` sniff can be a
      legitimate exclusion.

      For more information on ruleset configuration optiones, check out the PHPCS wiki:
      https://github.com/squizlabs/PHP_CodeSniffer/wiki/Annotated-Ruleset
      -->
    <rule ref="WordPress.WP.GlobalVariablesOverride">
        <exclude-pattern>/path/to/Tests/*Test\.php</exclude-pattern>
    </rule>
    <rule ref="WordPress.Files.FileName">
        <exclude-pattern>/path/to/Tests/*Test\.php</exclude-pattern>
    </rule>

    <!-- Disallow Yoda conditions in your codebase. -->
    <rule ref="Generic.ControlStructures.DisallowYodaConditions"/>

</ruleset>