@use '../../base' as *;
@use 'sass:string';

/// @access private
/// @author <a href="https://github.com/simeonoff" target="_blank">Simeon Simeonoff</a>
@mixin component {
    @include b(igx-checkbox) {
        $this: bem--selector-to-string(&);
        @include register-component(
            $name: string.slice($this, 2, -1),
            $deps: ()
        );

        @extend %cbx-display !optional;

        &:hover {
            @include e(label) {
                @extend %cbx-label--hover !optional;
            }

            @include e(label, $m: before) {
                 @extend %cbx-label--hover !optional;
            }

            @include e(ripple) {
                @extend %cbx-ripple--hover !optional;
            }

            @include e(composite) {
                @extend %cbx-composite--hover !optional;
            }

            @include e(composite-mark) {
                @extend %cbx-composite-mark--fluent !optional;
            }
        }

        &:active {
            @include e(ripple) {
                @extend %cbx-ripple--hover !optional;
                @extend %cbx-ripple--pressed !optional;
            }
        }

        @include e(input) {
            @extend %cbx-input !optional;
        }

        @include e(label) {
            @extend %cbx-label !optional;
            @extend %cbx-label-pos--after !optional;
        }

        @include e(label, $m: before) {
            @extend %cbx-label !optional;
            @extend %cbx-label-pos--before !optional;
        }

        @include e(composite-wrapper) {
            @extend %cbx-composite-wrapper !optional;
        }

        @include e(composite) {
            @extend %cbx-composite !optional;
        }

        @include e(composite-mark) {
            @extend %cbx-composite-mark !optional;
        }

        @include e(ripple) {
            @extend %cbx-ripple !optional;
        }

        @include m(indigo) {
            @include e(composite-mark) {
                @extend %cbx-composite-mark-indigo !optional;
            }
        }

        @include m(invalid) {
            @include e(composite) {
                @extend %cbx-composite--invalid !optional;
            }

            @include e(composite-wrapper) {
                @extend %cbx-composite-wrapper--invalid !optional;
            }

            @include e(label) {
                @extend %cbx-label--invalid !optional;
            }

            @include e(label, $m: before) {
                @extend %cbx-label--invalid !optional;
            }

            &:hover {
                @include e(ripple) {
                    @extend %cbx-ripple--hover !optional;
                    @extend %cbx-ripple--hover-invalid !optional;
                }

                @include e(composite) {
                    @extend %cbx-composite--invalid--hover !optional;
                }

                @include e(composite-mark) {
                    @extend %cbx-composite-mark--invalid--fluent !optional;
                }

                @include e(label) {
                    @extend %cbx-label--invalid !optional;
                }

                @include e(label, $m: before) {
                    @extend %cbx-label--invalid !optional;
                }
            }

            &:active {
                @include e(ripple) {
                    @extend %cbx-ripple--hover-invalid !optional;
                }
            }
        }

        @include mx(invalid, checked) {
            @include e(composite) {
                @extend %cbx-composite--x--invalid !optional;
            }

            &:hover {
                @include e(composite) {
                    @extend %cbx-composite--x--invalid--hover !optional;
                }

                @include e(composite-mark) {
                    @extend %cbx-composite-mark--x--fluent !optional;
                }
            }
        }

        @include m(focused) {
            @extend %igx-checkbox--focused !optional;

            @include e(ripple) {
                @extend %cbx-ripple--focused !optional;
            }

            &:hover {
                @include e(ripple) {
                    @extend %cbx-ripple--focused !optional;
                }
            }
        }

        @include mx(indigo, focused) {
            @extend %igx-checkbox--focused-indigo !optional;
        }

        @include mx(fluent, focused) {
            @extend %igx-checkbox--focused-fluent !optional;
        }

        @include mx(bootstrap, focused) {
            @extend %igx-checkbox--focused-bootstrap !optional;

            &:hover {
                @extend %igx-checkbox--focused-hovered-bootstrap !optional;
            }
        }

        @include mx(indigo, focused, checked) {
            @extend %igx-checkbox--focused-checked-indigo !optional;
        }

        @include mx(bootstrap, focused, checked) {
            @extend %igx-checkbox--focused-checked-bootstrap !optional;
        }

        @include mx(focused, checked) {
            @extend %igx-checkbox--focused-checked !optional;
        }

        @include mx(focused, invalid) {
            @include e(ripple) {
                @extend %cbx-ripple--focused-invalid !optional;
            }

            &:hover {
                @include e(ripple) {
                    @extend %cbx-ripple--hover-invalid !optional;
                }
            }
        }

        @include mx(indigo, focused, invalid) {
            @extend %igx-checkbox--focused-invalid-indigo !optional;
        }

        @include mx(bootstrap, focused, invalid) {
            @extend %igx-checkbox--focused-invalid-bootstrap !optional;
        }

        @include m(indeterminate) {
            @extend %igx-checkbox--indeterminate !optional;

            @include e(composite) {
                @extend %cbx-composite--x !optional;
            }

            @include e(composite-mark) {
                @extend %cbx-composite-mark--in !optional;
            }

            &:hover {
                @include e(ripple) {
                    @extend %cbx-ripple--hover !optional;
                    @extend %cbx-ripple--hover-checked !optional;
                }

                @include e(composite-mark) {
                    @extend %cbx-composite-mark--in--fluent !optional;
                }
            }

            &:active {
                @include e(ripple) {
                    @extend %cbx-ripple--hover !optional;
                    @extend %cbx-ripple--hover-checked !optional;
                    @extend %cbx-ripple--pressed !optional;
                }
            }
        }

        @include mx(indigo, indeterminate) {
            @extend %igx-checkbox--indeterminate-indigo !optional;
        }

        @include mx(fluent, indeterminate) {
            @extend %igx-checkbox--indeterminate-fluent !optional;
        }

        @include mx(invalid, indeterminate) {
            @extend %igx-checkbox--indeterminate--invalid !optional;

            &:hover {
                @include e(composite) {
                    @extend %cbx-composite--x--hover !optional;
                }

                @include e(composite-mark) {
                    @extend %cbx-composite-mark--in--fluent !optional;
                }
            }
        }

        @include mx(material, disabled, indeterminate) {
            @extend %igx-checkbox--disabled-indeterminate !optional;
        }

        @include mx(bootstrap, disabled, indeterminate) {
            @extend %igx-checkbox--disabled-indeterminate !optional;
        }

        @include mx(fluent, disabled, indeterminate) {
            @extend %igx-checkbox--disabled-indeterminate-fluent !optional;
        }

        @include mx(indigo, disabled, indeterminate) {
            @include e(composite) {
                @extend %igx-checkbox--disabled-indeterminate-indigo !optional;
            }
        }

        @include mx(indigo, focused, indeterminate) {
            @extend %igx-checkbox--focused-checked-indigo !optional;
        }

        @include mx(bootstrap, focused, indeterminate) {
            @extend %igx-checkbox--focused-checked-bootstrap !optional;
        }

        @include m(checked) {
            @include e(composite) {
                @extend %cbx-composite--x !optional;
            }

            @include e(composite-mark) {
                @extend %cbx-composite-mark--x !optional;
            }

            @include e(composite-wrapper) {
                @extend %cbx-composite-wrapper--x !optional;
            }

            &:hover {
                @include e(ripple) {
                    @extend %cbx-ripple--hover !optional;
                    @extend %cbx-ripple--hover-checked !optional;
                }

                @include e(composite) {
                    @extend %cbx-composite--x--hover !optional;
                }

                @include e(composite-mark) {
                    @extend %cbx-composite-mark--x--fluent !optional;
                }
            }

            &:active {
                @include e(ripple) {
                    @extend %cbx-ripple--hover !optional;
                    @extend %cbx-ripple--hover-checked !optional;
                    @extend %cbx-ripple--pressed !optional;
                }
            }
        }

        @include m(disabled) {
            @extend %cbx-display--disabled !optional;

            @include e(label) {
                @extend %cbx-label--disabled !optional;
            }

            @include e(label, $m: before) {
                @extend %cbx-label--disabled !optional;
            }

            @include e(composite) {
                @extend %cbx-composite--disabled !optional;
            }
        }

        @include m(plain) {
            @extend %cbx-display--plain !optional;
        }

        @include mx(focused, checked) {
            @include e(ripple) {
                @extend %cbx-ripple--focused !optional;
                @extend %cbx-ripple--focused-checked !optional;
            }

            &:hover {
                @include e(ripple) {
                    @extend %cbx-ripple--focused !optional;
                    @extend %cbx-ripple--focused--hover-checked !optional;
                }
            }
        }

        @include mx(focused, invalid, checked) {
            &:hover {
                @include e(ripple) {
                    @extend %cbx-ripple--hover-invalid !optional;
                }
            }
        }

        @include mx(focused, indeterminate) {
            @include e(ripple) {
                @extend %cbx-ripple--focused !optional;
                @extend %cbx-ripple--focused-checked !optional;
            }
        }

        @include mx(indeterminate, disabled) {
            @include e(composite) {
                @extend %cbx-composite--x--disabled !optional;
            }
        }

        @include mx(checked, disabled) {
            @include e(composite) {
                @extend %cbx-composite--x--disabled !optional;
            }
        }
    }
}
