import { useEffect, useMemo, useState } from 'react';
import { ThemeOverride, Flex, Progress, Text } from '@pega/cosmos-react-core';
import { StyledDemoWrap } from './Progress.styles';
import { loadingTimeoutMS } from './Progress.mocks';
export default {
    title: 'Core/Progress',
    component: Progress,
    excludeStories: ['ConfigurableProgress']
};
export const ProgressDemo = (args) => {
    const cycling = args.cycleProp !== 'none';
    const [visible, setVisible] = useState(args.visible);
    const [value, setValue] = useState(args.value ?? 0);
    const messages = ['Loading', 'Getting ready', 'Working on your request', 'Resolving content'];
    const [messageIndex, setMessageIndex] = useState(0);
    const message = useMemo(() => {
        if (args.cycleProp === 'message') {
            return messages[messageIndex];
        }
        return args.message;
    }, [args.cycleProp, args.message, messageIndex]);
    useEffect(() => {
        if (args.cycleProp !== 'value') {
            setValue(args.value ?? 0);
        }
    }, [args.cycleProp, args.value]);
    useEffect(() => {
        if (args.cycleProp !== 'visible') {
            setVisible(args.visible);
        }
    }, [args.cycleProp, args.visible]);
    useEffect(() => {
        if (args.cycleProp === 'none')
            return;
        const timeout = setTimeout(() => {
            switch (args.cycleProp) {
                case 'message': {
                    if (messageIndex < messages.length - 1)
                        setMessageIndex(messageIndex + 1);
                    else
                        setMessageIndex(0);
                    break;
                }
                case 'value': {
                    if (value < 100)
                        setValue(Math.min(value + 10, 100));
                    else
                        setValue(0);
                    break;
                }
                case 'visible': {
                    setVisible(!visible);
                    break;
                }
                default:
                    break;
            }
        }, loadingTimeoutMS);
        if (!cycling) {
            clearTimeout(timeout);
        }
        return () => clearTimeout(timeout);
    }, [args.cycleProp, message, visible, value, cycling]);
    return (<Flex container={{ direction: 'column', gap: 1 }}>
      <Text variant='h1'>Demo Content</Text>

      <StyledDemoWrap>
        {['block', 'local'].includes(args.placement || '') && (<Text>
            Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
            incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
            exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
            dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
            Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt
            mollit anim id est laborum.
          </Text>)}
        {args.placement === 'inline' && <Text>Progress demo </Text>}
        <Progress variant={args.variant} placement={args.placement} message={message} value={args.determinate || args.cycleProp === 'value' ? value : undefined} visible={visible} focusOnVisible={args.focusOnVisible} liveConfig={args.announce ? { contextualLabel: 'Demo' } : undefined}/>
      </StyledDemoWrap>
    </Flex>);
};
ProgressDemo.args = {
    variant: 'ring',
    placement: 'local',
    message: '',
    determinate: false,
    value: 67,
    focusOnVisible: false,
    visible: true,
    announce: false,
    cycleProp: 'none'
};
ProgressDemo.argTypes = {
    variant: { options: ['ring', 'bar', 'ellipsis'], control: { type: 'select' } },
    placement: { options: ['local', 'global', 'block', 'inline'], control: { type: 'select' } },
    message: { control: { type: 'text' } },
    focusOnVisible: { control: { type: 'boolean' } },
    determinate: { control: { type: 'boolean' } },
    value: { control: { type: 'number' } },
    visible: { control: { type: 'boolean' } },
    announce: { control: { type: 'boolean' } },
    cycleProp: { control: { type: 'select' }, options: ['none', 'value', 'message', 'visible'] }
};
export const ConfigurableProgress = (args) => {
    return (<ThemeOverride theme={{
            components: {
                progress: {
                    'progress-color': args.progressColor
                }
            }
        }}>
      <Flex container={{ justify: 'center', alignItems: 'center' }} as={StyledDemoWrap}>
        <Progress variant={args.variant} placement='local' message='Loading' visible/>
      </Flex>
    </ThemeOverride>);
};
ConfigurableProgress.args = {
    variant: 'ring',
    progressColor: '#076bc9'
};
ConfigurableProgress.argTypes = {
    variant: { options: ['ring', 'bar', 'ellipsis'], control: { type: 'select' } },
    progressColor: { control: { type: 'color' } }
};
//# sourceMappingURL=Progress.stories.jsx.map