'use client';

import { bool } from 'prop-types';
import { CheckboxProps } from './checkbox.types';
import { RippleEffect } from '../../ripple/ripple-effect';
import useRippleEffect from '../../ripple/hooks/useRippleEffect';
import { InputLayout } from '../input-layout/input-layout';
import {
    forwardRef,
    useEffect,
    useImperativeHandle,
    useRef,
    useState,
} from 'react';

/**
 * Checkbox component
 ** description
 */

export const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(
    ({ centralRipple = true, ...props }, ref) => {
        const [isActive, setIsActive] = useState<boolean>(false),
            [checked, setChecked] = useState<boolean>(props.checked ?? false),
            ripplesRef = useRef(null),
            checkboxRef = useRef(null),
            events = useRippleEffect(ripplesRef, setIsActive);

        const extraClassStyles =
            `m3 m3-checkbox-container ${isActive === true ? 'visible' : ''}`.trimEnd();

        useImperativeHandle(ref, () => checkboxRef.current);

        useEffect(() => {
            setChecked(!checked);
        }, [checkboxRef.current?.checked]);

        return (
            <div {...events} className={extraClassStyles}>
                <InputLayout
                    {...props}
                    indeterminate={props.indeterminate}
                    ref={checkboxRef}
                    type={'checkbox'}
                />
                <span className={'m3 m3-checkbox-state'} />
                <span className={'m3 m3-checkbox-state-layer'} />
                <RippleEffect
                    callback={setIsActive}
                    central={centralRipple}
                    className={'m3-checkbox-ripple-layer'}
                    ref={ripplesRef}
                />
                {props.children}
            </div>
        );
    },
);

Checkbox.propTypes = {
    indeterminate: bool,
    centralRipple: bool,
};