<?php

require __DIR__ . '/tools/php-cs-fixer.d/PhpdocSingleLineVarFixer.php';

return (new PhpCsFixer\Config())
    ->registerCustomFixers([
        new \PharIo\CSFixer\PhpdocSingleLineVarFixer()
    ])
    ->setRiskyAllowed(true)
    ->setRules(
        [
            'PharIo/phpdoc_single_line_var_fixer'           => true,

            'align_multiline_comment'                       => true,
            'array_indentation'                             => true,
            'array_syntax'                                  => ['syntax' => 'short'],
            'binary_operator_spaces'                        => [
                'operators' => [
                    '='  => 'align_single_space_minimal',
                    '=>' => 'align',
                ],
            ],
            'blank_line_after_namespace'                    => true,
            'blank_line_after_opening_tag'                  => false,
            'blank_line_before_statement'                   => [
                'statements' => [
                    'break',
                    'continue',
                    'declare',
                    'do',
                    'for',
                    'foreach',
                    'if',
                    'include',
                    'include_once',
                    'require',
                    'require_once',
                    'return',
                    'switch',
                    'throw',
                    'try',
                    'while',
                    'yield',
                ],
            ],
            // deprecated fixer removed: "braces"; use dedicated rules provided by PHP-CS-Fixer instead
            'cast_spaces'                                   => ['space' => 'none'],

            // This fixer removes the blank line at class start, no way to disable that, so we disable the fixer :(
            //'class_attributes_separation'                   => ['elements' => ['const', 'method', 'property']],

            'combine_consecutive_issets'                    => true,
            'combine_consecutive_unsets'                    => true,
            'compact_nullable_type_declaration'             => true,
            'concat_space'                                  => ['spacing' => 'one'],
            'date_time_immutable'                           => true,
            'declare_equal_normalize'                       => ['space' => 'single'],
            'declare_strict_types'                          => true,
            'dir_constant'                                  => true,
            'elseif'                                        => true,
            'encoding'                                      => true,
            'full_opening_tag'                              => true,
            'fully_qualified_strict_types'                  => true,
            'function_declaration'                          => [
                'closure_function_spacing' => 'one'
            ],
            'header_comment'                                => false,
            'indentation_type'                              => true,
            'is_null'                                       => true,
            'line_ending'                                   => true,
            'list_syntax'                                   => ['syntax' => 'short'],
            'logical_operators'                             => true,
            'lowercase_cast'                                => true,
            'constant_case'                                 => ['case' => 'lower'],
            'lowercase_keywords'                            => true,
            'lowercase_static_reference'                    => true,
            'magic_constant_casing'                         => true,
            'method_argument_space'                         => ['on_multiline' => 'ensure_fully_multiline'],
            'modernize_types_casting'                       => true,
            'multiline_comment_opening_closing'             => true,
            'multiline_whitespace_before_semicolons'        => true,
            'native_constant_invocation'                    => true,
            'native_function_casing'                        => true,
            'global_namespace_import'                       => [
                'import_classes'   => true,
                'import_constants' => true,
                'import_functions' => true,
            ],
            'native_function_invocation'                    => false,
            // "new_with_braces" is deprecated → use "new_with_parentheses"
            'new_with_parentheses'                          => false,
            'no_alias_functions'                            => true,
            'no_alternative_syntax'                         => true,
            'no_blank_lines_after_class_opening'            => false,
            'no_blank_lines_after_phpdoc'                   => true,
            'blank_lines_before_namespace'                  => false,
            'no_closing_tag'                                => true,
            'no_empty_comment'                              => true,
            'no_empty_phpdoc'                               => true,
            'no_empty_statement'                            => true,
            'no_extra_blank_lines'                          => true,
            'no_homoglyph_names'                            => true,
            'no_leading_import_slash'                       => true,
            'no_leading_namespace_whitespace'               => true,
            'no_mixed_echo_print'                           => ['use' => 'print'],
            'no_multiline_whitespace_around_double_arrow'   => true,
            'no_null_property_initialization'               => true,
            'no_php4_constructor'                           => true,
            'no_short_bool_cast'                            => true,
            'echo_tag_syntax'                               => ['format' => 'long'],
            'no_singleline_whitespace_before_semicolons'    => true,
            'no_spaces_after_function_name'                 => true,
            // deprecated: no_spaces_inside_parenthesis → use spaces_inside_parentheses
            'spaces_inside_parentheses'                     => ['space' => 'none'],
            'no_superfluous_elseif'                         => true,
            'no_superfluous_phpdoc_tags'                    => true,
            // deprecated: no_trailing_comma_in_list_call (covered by no_trailing_comma_in_singleline)
            'no_trailing_comma_in_singleline'               => true,
            'no_trailing_whitespace'                        => true,
            'no_trailing_whitespace_in_comment'             => true,
            'no_unneeded_control_parentheses'               => false,
            // deprecated: no_unneeded_curly_braces → use no_unneeded_braces
            'no_unneeded_braces'                            => false,
            'no_unneeded_final_method'                      => true,
            'no_unreachable_default_argument_value'         => true,
            'no_unset_on_property'                          => true,
            'no_unused_imports'                             => true,
            'no_useless_else'                               => true,
            'no_useless_return'                             => true,
            'no_whitespace_before_comma_in_array'           => true,
            'no_whitespace_in_blank_line'                   => true,
            'non_printable_character'                       => true,
            'normalize_index_brace'                         => true,
            'object_operator_without_whitespace'            => true,
            'ordered_class_elements'                        => [
                'order' => [
                    'use_trait',
                    'constant_public',
                    'constant_protected',
                    'constant_private',
                    'property_public_static',
                    'property_protected_static',
                    'property_private_static',
                    'property_public',
                    'property_protected',
                    'property_private',
                    'method_public_static',
                    'construct',
                    'destruct',
                    'magic',
                    'phpunit',
                    'method_public',
                    'method_protected',
                    'method_private',
                    'method_protected_static',
                    'method_private_static',
                ],
            ],
            // Group and order use-statements by type: classes/interfaces/traits, then functions, then constants
            'ordered_imports'                               => [
                'imports_order' => ['class', 'function', 'const'],
                // keep alphabetical ordering within each group (default)
                'sort_algorithm' => 'alpha',
            ],
            'phpdoc_add_missing_param_annotation'           => true,
            'phpdoc_align'                                  => true,
            'phpdoc_annotation_without_dot'                 => true,
            'phpdoc_indent'                                 => true,
            'phpdoc_no_access'                              => true,
            'phpdoc_no_empty_return'                        => true,
            'phpdoc_no_package'                             => true,
            'phpdoc_order'                                  => true,
            'phpdoc_return_self_reference'                  => true,
            'phpdoc_scalar'                                 => true,
            'phpdoc_separation'                             => true,
            'phpdoc_single_line_var_spacing'                => true,
            'phpdoc_to_comment'                             => false,
            'phpdoc_trim'                                   => true,
            'phpdoc_trim_consecutive_blank_line_separation' => true,
            'phpdoc_types'                                  => ['groups' => ['simple', 'meta']],
            'phpdoc_types_order'                            => true,
            'phpdoc_to_return_type'                         => true,
            'phpdoc_var_without_name'                       => true,
            'pow_to_exponentiation'                         => true,
            'protected_to_private'                          => true,
            'return_assignment'                             => true,
            'return_type_declaration'                       => ['space_before' => 'none'],
            'self_accessor'                                 => false,
            'semicolon_after_instruction'                   => true,
            'set_type_to_cast'                              => true,
            'short_scalar_cast'                             => true,
            'simplified_null_return'                        => true,
            'single_blank_line_at_eof'                      => true,
            'single_import_per_statement'                   => true,
            'single_line_after_imports'                     => true,
            'single_quote'                                  => true,
            'standardize_not_equals'                        => true,
            'ternary_to_null_coalescing'                    => true,
            'trailing_comma_in_multiline'                   => false,
            'trim_array_spaces'                             => true,
            'unary_operator_spaces'                         => true,
            // deprecated: visibility_required → use modifier_keywords
            'modifier_keywords'                             => true,
            'void_return'                                   => true,
            'whitespace_after_comma_in_array'               => true,
            'yoda_style'                                    => false
        ]
    )
    ->setFinder(
        PhpCsFixer\Finder::create()
            ->files()
            ->in(__DIR__ . '/src')
            ->in(__DIR__ . '/tests')
            ->exclude('_files')
            ->notName('*.phpt')
            ->notName('autoload.php')
    );
