@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-input-group) {
        $this: bem--selector-to-string(&);
        @include register-component(
            $name: string.slice($this, 2, -1),
            $deps: (
                igx-icon
            )
        );

        // BASE START
        @extend %form-group-display !optional;

        @include e(label) {
            @extend %form-group-label !optional;
        }

        // Base bundle
        @include e(bundle) {
            @extend %form-group-bundle !optional;

            &:hover {
                @extend %form-group-bundle--hover !optional;
            }
        }

        @include e(bundle-start) {
            @extend %form-group-bundle-start !optional;
        }

        @include e(bundle-end) {
            @extend %form-group-bundle-end !optional;
        }

        @include e(bundle-main) {
            @extend %form-group-bundle-main !optional;
        }

        @include e(notch) {
            @extend %igx-input-group__notch !optional;
        }

        @include e(filler) {
            @extend %igx-input-group__filler !optional;
        }

        @include e(input) {
            @extend %form-group-input !optional;
            @extend %autofill-background-fix !optional;

            &:hover {
                @extend %form-group-input--hover !optional;
            }

            &:focus {
                @extend %form-group-input--focus !optional;
            }
        }

        @include e(file-input) {
            @extend %form-group-file-input !optional;

            &:hover {
                @extend %form-group-input--hover !optional;
            }

            &:focus {
                @extend %form-group-input--focus !optional;
            }
        }

        @include e(hint) {
            @extend %form-group-helper !optional;
        }

        @include e(hint-item, $m: start) {
            @extend %form-group-helper-item !optional;
            @extend %form-group-helper-item--start !optional;
        }

        @include e(hint-item, $m: end) {
            @extend %form-group-helper-item !optional;
            @extend %form-group-helper-item--end !optional;
        }

        // The animated bottom line of the LINE and BOX input types.
        @include e(line) {
            @extend %form-group-line !optional;
        }

        // Textarea element
        @include e(textarea) {
            @extend %form-group-input !optional;
            @extend %form-group-textarea !optional;

            &:hover {
                @extend %form-group-input--hover !optional;
            }

            &:focus {
                @extend %form-group-input--focus !optional;
            }
        }

        @include m(suffixed) {
            @extend %suffixed !optional;
        }

        @include m(readonly) {
            @extend %form-group-display--readonly !optional;
        }

        // Textarea modifier
        @include m(textarea-group) {
            @extend %textarea-group !optional;

            @include e(bundle-main) {
                @extend %form-group-textarea-group-bundle-main !optional;
            }

            @include e(bundle) {
                @extend %form-group-textarea-group-bundle !optional;
            }

            @include e(label) {
                @extend %form-group-textarea-label !optional;
            }
        }

        @include mx(textarea-group, border) {
            @extend %textarea-group--outlined !optional;
        }

        @include mx(textarea-group, box) {
            @extend %textarea-group--box !optional;
        }

        @include mx(textarea-group, focused) {
            @include e(label) {
                @extend %textarea-group-label--focused !optional;
            }
        }

        @include mx(textarea-group, filled) {
            @include e(notch) {
                @extend %textarea-group-notch--focused !optional;
            }

            @include e(label) {
                @extend %textarea-group-label--focused !optional;
            }
        }

        @include mx(textarea-group, placeholder) {
            @extend %form-group-placeholder !optional;

            @include e(notch) {
                @extend %textarea-group-notch--focused !optional;
            }

            @include e(label) {
                @extend %textarea-group-label--focused !optional;
            }
        }

        @include mx(textarea-group, filled, border) {
            @include e(notch) {
                @extend %textarea-group-notch--focused !optional;
            }

            @include e(label) {
                @extend %textarea-group-label--filled--border !optional;
            }
        }

        @include mx(textarea-group, placeholder, border) {
            @extend %form-group-placeholder !optional;

            @include e(notch) {
                @extend %textarea-group-notch--focused !optional;
            }

            @include e(label) {
                @extend %textarea-group-label--filled--border !optional;
            }
        }

        @include mx(textarea-group, focused, border) {
            @include e(label) {
                @extend %textarea-group-label--focused--border !optional;
            }
        }

        @include m(focused) {
            @extend %form-group-display !optional;
            @extend %form-group-display--focused !optional;

            @include e(bundle) {
                @extend %form-group-bundle--focus	!optional;
            }

            @include e(label) {
                @extend %form-group-label--float !optional;
                @extend %form-group-label--focus !optional;
            }

            @include e(line) {
                @extend %form-group-line--focus !optional;
            }
        }

        @include m(placeholder) {
            @extend %form-group-placeholder !optional;

            @include e(label) {
                @extend %form-group-label--float !optional;
            }
        }

        @include m(filled) {
            @extend %form-group-display--filled !optional;

            @include e(label) {
                @extend %form-group-label--float !optional;
            }
        }

        @include m(file) {
            @extend %form-group-display--file !optional;

            @include e(label) {
                @extend %form-group-label--float !optional;
            }
        }
        @include mx(file, focused) {
            @extend %form-group-display--file-focused !optional;
        }

        @include mx(file, border) {
            @extend %form-group-display--file-border !optional;
        }

        @include mx(file, border, focused) {
            @extend %form-group-display--file-border-focused !optional;
        }

        @include mx(file, border, valid) {
            @extend %form-group-display--file-border-success !optional;
        }

        @include mx(file, border, warning) {
            @extend %form-group-display--file-border-warning !optional;
        }

        @include mx(file, border, invalid) {
            @extend %form-group-display--file-border-error !optional;
        }

        @include m(required) {
            @include e(label) {
                @extend %form-group-label--required !optional;
            }
        }

        @include m(warning) {
            @include e(label) {
                @extend %form-group-label--warning !optional;
            }

            @include e(line) {
                @extend %form-group-line--warning !optional;
            }

            @include e(hint) {
                @extend %form-group-helper--warning !optional;
            }

            @include e(bundle) {
                @extend %form-group-bundle--warning !optional;
            }
        }

        @include m(invalid) {
            @extend %form-group-display--invalid !optional;

            @include e(label) {
                @extend %form-group-label--error !optional;
            }

            @include e(line) {
                @extend %form-group-line--error !optional;
            }

            @include e(hint) {
                @extend %form-group-helper--error !optional;
            }

            @include e(bundle) {
                @extend %form-group-bundle--error !optional;
            }
        }

        @include m(valid) {
            @include e(label) {
                @extend %form-group-label--success !optional;
            }

            @include e(line) {
                @extend %form-group-line--success !optional;
            }

            @include e(hint) {
                @extend %form-group-helper--success !optional;
            }

            @include e(bundle) {
                @extend %form-group-bundle--success !optional;
            }
        }

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

            @include e(bundle) {
                @extend %form-group-bundle--disabled !optional;
            }

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

            @include e(input) {
                @extend %form-group-input--disabled !optional;
            }

            @include e(textarea) {
                @extend %form-group-textarea--disabled !optional;
            }

            @include e(file-input) {
                @extend %form-group-file-input--disabled !optional;
            }

            @include e(hint) {
                @extend %form-group-helper--disabled !optional;
            }
        }

        @include mx(disabled, required) {
            @extend %form-group-display--disabled !optional;

            @include e(bundle) {
                @extend %form-group-bundle--disabled !optional;
            }

            @include e(input) {
                @extend %form-group-input--disabled !optional;
            }

            @include e(textarea) {
                @extend %form-group-textarea--disabled !optional;
            }

            @include e(file-input) {
                @extend %form-group-input--disabled !optional;
            }
        }

        // Type box START
        @include m(box) {
            @extend %form-group-display--box !optional;

            @extend %form-group-display--no-margin !optional;

            @include e(wrapper) {
                @extend %form-group-box-wrapper !optional;
            }

            @include e(bundle) {
                @extend %form-group-bundle--box !optional;
            }

            @include e(input) {
                @extend %form-group-input--box !optional;
            }

            @include e(bundle-main) {
                @extend %form-group-bundle-main--box !optional;
            }
        }

        @include mx(box, focused) {
            @include e(bundle) {
                @extend %form-group-bundle--box-focus !optional;
            }
        }

        @include mx(box, disabled) {
            @include e(bundle) {
                @extend %form-group-bundle--box-disabled !optional;
            }
        }

        @include mx(box, textarea-group, placeholder) {
            @extend %form-group-placeholder !optional;
        }

        // Type box END

        // Type border START
        @include m(border) {
            @extend %form-group-display--border !optional;
            @extend %form-group-display--no-margin !optional;

            @include e(bundle) {
                @extend %form-group-bundle--border !optional;
            }

            @include e(bundle-main) {
                @extend %form-group-bundle-main--border !optional;
            }

            @include e(line) {
                @extend %form-group-line--hidden !optional;
            }

            @include e(input) {
                @extend %form-group-input--border !optional;
            }

            @include e(file-input) {
                @extend %form-group-input--border !optional;
            }

            @include e(label) {
                @extend %form-group-label--border !optional;
            }

            @include e(notch) {
                @extend  %igx-input-group__notch--border !optional;
            }
        }

        @include mx(border, filled) {
            @extend %form-group-label--filled-border !optional;

            @include e(label) {
                @extend %form-group-label--float-border !optional;
            }
        }

        @include mx(border, file) {
            @extend %form-group-label--file-border !optional;

            @include e(label) {
                @extend %form-group-label--float-border !optional;
            }
        }

        @include mx(border, focused) {
            @extend %form-group-label--focused-border !optional;

            @include e(label) {
                @extend %form-group-label--float-border !optional;
            }
        }

        @include mx(border, placeholder) {
            @extend %form-group-label--placeholder-border !optional;
            @extend %form-group-placeholder !optional;

            @include e(label) {
                @extend %form-group-label--float-border !optional;
            }
        }

        @include mx(border, valid) {
            @extend %form-group-border--success !optional;
        }

        @include mx(border, invalid) {
            @extend %form-group-border--error !optional;
        }

        @include mx(border, warning) {
            @extend %form-group-border--warning !optional;
        }

        @include mx(border, disabled) {
            @extend %form-group-border--disabled !optional;

            @include e(bundle) {
                @extend %form-group-bundle-border--disabled !optional;
            }
        }
        // Type border END

        // Type Search START
        @include m(search) {
            @extend %form-group-display--search !optional;

            @extend %form-group-display--no-margin !optional;

            @include e(bundle) {
                @extend %form-group-bundle--search !optional;

                &:hover {
                    @extend %form-group-bundle-search--hover !optional;
                }
            }

            @include e(notch) {
                @extend %igx-input-group__notch--search !optional;
            }

            @include e(bundle-main) {
                @extend %form-group-bundle-main--search !optional;
            }

            @include e(line) {
                @extend %form-group-line--hidden !optional;
            }

            @include e(input) {
                @extend %form-group-input--search !optional;
            }

            @include e(label) {
                @extend %form-group-label--search !optional;
            }
        }

        @include mx(search, focused) {
            @include e(bundle) {
                @extend %form-group-bundle-search--focus !optional;
            }
        }

        @include mx(search, disabled) {
            @include e(bundle) {
                @extend %form-group-bundle-search--disabled !optional;
            }
        }

        @include e(upload-button) {
            @extend %upload-button !optional;
        }

        // BASE END

        // ============================== //

        // FLUENT START
        @include m(fluent) {
            @extend %igx-input-group-fluent !optional;

            @include e(bundle) {
                @extend %form-group-bundle--fluent !optional;

                &:hover {
                    @extend %form-group-bundle--fluent--hover !optional;
                }
            }

            @include e(bundle-main) {
                @extend %form-group-bundle-main--fluent !optional;
            }

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

            @include e(textarea) {
                @extend %fluent-textarea !optional;
            }

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

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

        @include mx(fluent, placeholder) {
            @extend %form-group-placeholder !optional;

            @include e(label) {
                @extend %fluent-placeholder-label !optional;
            }
        }

        @include mx(fluent, disabled) {
            @include e(bundle) {
                @extend %form-group-bundle--fluent-disabled !optional;

                &:hover {
                    @extend %form-group-bundle--fluent--hover-disabled !optional;
                }
            }

            @include e(input) {
                @extend %fluent-input-disabled !optional;

                &:hover {
                    @extend %fluent-input-disabled !optional;
                }

                &:focus {
                    @extend %fluent-input-disabled !optional;
                }
            }

            @include e(file-input) {
                @extend %fluent-input-disabled !optional;

                &:hover {
                    @extend %fluent-input-disabled !optional;
                }

                &:focus {
                    @extend %fluent-input-disabled !optional;
                }
            }

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

        @include mx(fluent, filled) {
            @include e(label) {
                @extend %fluent-label-filled !optional;
            }
        }

        @include mx(fluent, file) {
            @include e(label) {
                @extend %fluent-label-filled !optional;
            }

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

        @include mx(fluent, textarea-group) {
            @include e(bundle) {
                @extend %form-group-bundle-fluent--textarea !optional;
            }
        }

        @include mx(fluent, focused) {
            @include e(bundle) {
                @extend %form-group-bundle--fluent--focus !optional;
            }

            @include e(label) {
                @extend %fluent-label-focused !optional;
            }
        }

        @include mx(fluent, textarea-group) {
            @include e(bundle-start) {
                @extend %form-group-bundle-textarea-start--fluent !optional;
            }
        }

        @include mx(fluent, textarea-group) {
            @include e(bundle-end) {
                @extend %form-group-bundle-textarea-end--fluent !optional;
            }
        }

        @include mx(fluent, required) {
            @include e(label) {
                @extend %form-group-bundle-required--fluent !optional;
                @extend %form-group-label-required--fluent !optional;
            }
        }

        @include mx(fluent, required, disabled) {
            @include e(label) {
                @extend %form-group-label-required--disabled--fluent !optional;
            }
        }

        @include mx(fluent, valid) {
            @include e(bundle) {
                @extend %form-group-bundle-success--fluent !optional;

                &:hover {
                    @extend %form-group-bundle-success--fluent--hover !optional;
                }

                &:focus-within {
                    @extend %form-group-bundle-success--fluent--focus !optional;
                }
            }

            @include e(label) {
                @extend %fluent-label-success !optional;
            }
        }

        @include mx(fluent, invalid) {
            @include e(bundle) {
                @extend %form-group-bundle-error--fluent !optional;

                &:hover {
                    @extend %form-group-bundle-error--fluent--hover !optional;
                }

                &:focus-within {
                    @extend %form-group-bundle-error--fluent--focus !optional;
                }
            }

            @include e(label) {
                @extend %fluent-label-error !optional;
            }
        }

        @include mx(fluent, search) {
            @extend %igx-input-group-fluent-search !optional;

            @include e(bundle) {
                @extend %form-group-bundle--fluent !optional;

                &:hover {
                    @extend %form-group-bundle--fluent--hover !optional;
                }
            }

            @include e(bundle-main) {
                @extend %form-group-bundle-main--fluent !optional;
            }

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

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

        @include mx(fluent, search, focused) {
            @extend %igx-input-group-fluent-search--focused !optional;
        }
        // FLUENT END

        // ============================== //

        // INDIGO START
        @include m(indigo) {
            @extend %form-group-display--no-margin !optional;

            @include e(wrapper) {
                @extend %form-group-box-wrapper !optional;
            }

            @include e(bundle) {
                @extend %form-group-bundle--indigo !optional;
            }

            @include e(input) {
                @extend %form-group-input--indigo !optional;
            }

            @include e(file-input) {
                @extend %form-group-input--indigo !optional;
            }

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

            @include e(textarea) {
                @extend %indigo-textarea !optional;
            }
        }

        @include mx(indigo, focused) {
            @include e(bundle) {
                @extend %indigo--box-focused !optional;
            }

            @include e(label) {
                @extend %indigo-label--focused !optional;
            }
        }

        @include mx(indigo, disabled) {
            @include e(bundle) {
                @extend %form-group-bundle--indigo--disabled !optional;
            }

            @include e(input) {
                @extend %form-group-input--disabled !optional;
            }

            @include e(file-input) {
                @extend %form-group-input--disabled !optional;
            }
        }

        // INDIGO END

        // ============================== //

        // BOOTSTRAP START
        @include m(bootstrap) {
            @extend %form-group-display--bootstrap !optional;

            @include e(bundle) {
                @extend %form-group-bundle--bootstrap !optional;

                &:hover {
                    @extend %form-group-bundle--bootstrap-hover !optional;
                }
            }

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

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

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

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

            @include e(bundle-start) {
                @extend %form-group-bundle-start--bootstrap !optional;
            }

            @include e(bundle-end) {
                @extend %form-group-bundle-end--bootstrap !optional;
            }
        }

        @include mx(bootstrap, file) {
            @extend %form-group-display--bootstrap-file !optional;

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

            @include e(bundle-end) {
                @extend %bootstrap-bundle-end !optional;
            }

            @include e(upload-button) {
                @extend %bootstrap-upload-button !optional;
            }
        }

        @include mx(bootstrap, file, disabled) {
            @include e(upload-button) {
                @extend %bootstrap-file-disabled-upload-button !optional;
            }
        }

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

        @include mx(bootstrap, file, valid, focused) {
            @extend %bootstrap-file-valid !optional;
        }

        @include mx(bootstrap, file, warning, focused) {
            @extend %bootstrap-file-warning !optional;
        }

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

        @include mx(bootstrap, file, valid, focused) {
            @extend %bootstrap-file-valid-focused !optional;
        }

        @include mx(bootstrap, file, warning, focused) {
            @extend %bootstrap-file-warning-focused !optional;
        }

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

        @include mx(bootstrap, prefixed) {
            @extend %form-group-display--bootstrap-prefixed !optional;
        }

        @include mx(bootstrap, suffixed) {
            @extend %form-group-display--bootstrap-suffixed !optional;
        }

        @include mx(bootstrap, suffixed, focused) {
            @extend %form-group-display--bootstrap-suffixed-focused !optional;
        }

        @include mx(bootstrap, suffixed, valid) {
            @extend %form-group-display--bootstrap-suffixed-valid !optional;
        }

        @include mx(bootstrap, suffixed, invalid) {
            @extend %form-group-display--bootstrap-suffixed-invalid !optional;
        }

        @include mx(bootstrap, search) {
            @include e(input) {
                @extend %bootstrap-input--search !optional;
            }
        }

        @include mx(bootstrap, focused) {
            @include e(bundle) {
                @extend %form-group-bundle--bootstrap-focused !optional;
            }

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

            @include e(file-input) {
                @extend %bootstrap-input--focus !optional;
            }

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


            @include e(textarea) {
                @extend %bootstrap-input--focus !optional;
            }
        }

        @include mx(bootstrap, valid) {
            @include e(input) {
                @extend %bootstrap-input--success !optional;

                &:hover {
                    @extend %bootstrap-input--success !optional;
                }
            }

            @include e(file-input) {
                @extend %bootstrap-input--success !optional;

                &:hover {
                    @extend %bootstrap-input--success !optional;
                }
            }

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


            @include e(textarea) {
                @extend %bootstrap-input--success !optional;

                &:hover {
                    @extend %bootstrap-input--success !optional;
                }
            }
        }

        @include mx(bootstrap, invalid) {
            @include e(input) {
                @extend %bootstrap-input--error !optional;

                &:hover {
                    @extend %bootstrap-input--error !optional;
                }
            }

            @include e(file-input) {
                @extend %bootstrap-input--error !optional;

                &:hover {
                    @extend %bootstrap-input--error !optional;
                }
            }

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

            @include e(textarea) {
                @extend %bootstrap-input--error !optional;

                &:hover {
                    @extend %bootstrap-input--error !optional;
                }
            }
        }

        @include mx(bootstrap, warning) {
            @include e(input) {
              @extend %bootstrap-input--warning !optional;

              &:hover {
                  @extend %bootstrap-input--warning !optional;
              }
            }

            @include e(file-input) {
              @extend %bootstrap-input--warning !optional;

              &:hover {
                  @extend %bootstrap-input--warning !optional;
              }
            }

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

            @include e(textarea) {
              @extend %bootstrap-input--warning !optional;

              &:hover {
                  @extend %bootstrap-input--warning !optional;
              }
            }
        }

        @include mx(bootstrap, textarea-group) {
            @include e(bundle) {
                @extend %form-group-bundle-bootstrap--textarea !optional;
            }
        }

        @include mx(bootstrap, disabled) {
            @include e(bundle) {
                @extend %form-group-display--disabled-bootstrap !optional;
            }

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

            @include e(file-input) {
                @extend %bootstrap-file-input--disabled !optional;
            }

            @include e(textarea) {
                @extend %bootstrap-input--disabled !optional;
            }
        }
        // BOOTSTRAP END
    }
}
