import { classNames, optionClassNames, stateClassNames, States, FillMode } from '../misc';

import { KendoComponent } from '../_types/component';
import { BUTTON_GROUP_FOLDER_NAME, BUTTON_GROUP_MODULE_NAME } from './constants';
export const BUTTONGROUP_CLASSNAME = `k-button-group`;

const states = [
    States.disabled
];

const options = {
    fillMode: [ FillMode.undefined, FillMode.solid, FillMode.flat, FillMode.outline, FillMode.clear, FillMode.link ],
};

export type KendoButtonGroupOptions = {
  fillMode?: (typeof options.fillMode)[number] | null;
};

export type KendoButtonGroupProps = KendoButtonGroupOptions & {
    stretched?: boolean;
};

export type KendoButtonGroupState = { [K in (typeof states)[number]]?: boolean };

const defaultOptions = {};

export const ButtonGroup: KendoComponent<KendoButtonGroupProps & KendoButtonGroupState & React.HTMLAttributes<HTMLDivElement>> = (
    props: KendoButtonGroupProps &
        KendoButtonGroupState &
        React.HTMLAttributes<HTMLDivElement>
) => {
    const {
        fillMode,
        disabled,
        stretched,
        ...other
    } = props;

    return (
        <div
            role="group"
            {...other}
            className={classNames(
                props.className,
                BUTTONGROUP_CLASSNAME,
                optionClassNames(BUTTONGROUP_CLASSNAME, {
                    fillMode
                }),
                stateClassNames(BUTTONGROUP_CLASSNAME, {
                    disabled
                }),
                {
                    [`${BUTTONGROUP_CLASSNAME}-stretched`]: stretched,
                }
            )}
            {...(disabled && { 'aria-disabled': 'true' })}
        >
            { props.children }
        </div>
    );
};

ButtonGroup.states = states;
ButtonGroup.options = options;
ButtonGroup.className = BUTTONGROUP_CLASSNAME;
ButtonGroup.defaultOptions = defaultOptions;
ButtonGroup.moduleName = BUTTON_GROUP_MODULE_NAME;
ButtonGroup.folderName = BUTTON_GROUP_FOLDER_NAME;

/**
 * @ariaSpec
 * ButtonGroup implements the WAI-ARIA group pattern.
 *
 * - Container: role="group"
 * - When disabled: aria-disabled="true"
 * - Child buttons: aria-pressed for toggle state
 */
ButtonGroup.ariaSpec = {
    selector: '.k-button-group',
    rules: [
        { selector: '.k-button-group:not(.k-split-button)', attribute: 'role=group', usage: 'Sets the proper role for the group of buttons.' },
        { selector: '.k-button-group.k-disabled', attribute: 'aria-disabled=true', usage: 'The attribute is rendered only when the entire button group is disabled.' },
        { selector: '.k-button-group:not(.k-split-button):not(.k-scheduler-navigation):not(.k-zoom-control) .k-button', attribute: 'aria-pressed (when selected)', usage: 'Specifies the current state of the ButtonGroup. Only the selected button within the group will have this attribute set to true.' },
    ]
};

export default ButtonGroup;
