/**
 * WordPress components that create the necessary UI elements for the block
 *
 * @see https://developer.wordpress.org/block-editor/packages/packages-components/
 */
import {TextControl, SelectControl, Panel, PanelBody, PanelRow} from '@wordpress/components';
import {__} from '@wordpress/i18n';

/**
 * React hook that is used to mark the block wrapper element.
 * It provides all the necessary props like the class name.
 *
 * @see https://developer.wordpress.org/block-editor/reference-guides/packages/packages-block-editor/#useblockprops
 */
import {
    useBlockProps,
    InspectorControls,
} from '@wordpress/block-editor';
import styled from "@emotion/styled";
import IframeEmotionCacheProvider from '../utils/IframeEmotionCacheProvider';


/**
 * The edit function describes the structure of your block in the context of the
 * editor. This represents what the editor will render when the block is used.
 *
 * @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-edit-save/#edit
 *
 * @param {Object}   props               Properties passed to the function.
 * @param {Object}   props.attributes    Available block attributes.
 * @param {Function} props.setAttributes Function that updates individual attributes.
 *
 * @return {WPElement} Element to render.
 */
export default function Edit({attributes, setAttributes}) {
    const blockProps = useBlockProps();

    const range = (start, end) => {
        return Array.from({ length: end - start + 1 }, (_, index) => start + index);
    }

    const LatepointCalendarWrapper = styled.div`
        box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.1);
        border-radius: 4px;
        border: 1px solid #ddd;
        border-bottom-color: #bbb;
        background-color: #fff;
        padding: 20px;
        max-width: 400px;
    `;

    const rangeTypes = [
        {label: 'Month', value: 'month'},
        {label: 'Week', value: 'week'},
    ];

    const LatepointCalendar = styled.div`
        border: 1px solid #ddd;
        border-right: none;
        background: #fbfbfb;
    `;

    const LatepointBlockCaption = styled.div`
        font-weight: 500;
        margin-bottom: 10px;
        font-size: 12px;
        text-transform: uppercase;
        letter-spacing: 1px;
    `;

    const LCRow = styled.div`
        display: grid;
        grid-template-columns: repeat(7, 1fr);
    `;

    const LCHead = styled.div`
        border-bottom: 1px solid #ddd;
        background: #f3f3f3;
    `;

    const LCCell = styled.div`
        padding: 10px;
        text-align: center;
        border-right: 1px solid #ddd;
    `;
    const LCDate = styled.div`
        padding: 5px;
        border-radius: 4px;
        background-color: #e1e1e1;
    `;

    const LCText = styled.div`
        padding: 3px;
        border-radius: 4px;
        background-color: #ecebeb;
    `;

    const weekCells = (type) => {
        return (
            <>
                {range(1, 7).map(() => (
                    <LCCell>{type === 'date' ? <LCDate></LCDate> : <LCText></LCText>}</LCCell>
                ))}
            </>
        )
    };


    return (
        <div {...blockProps}>
            <InspectorControls>
                <Panel>
                    <PanelBody title="Latepoint Calendar Settings">
                        <TextControl __nextHasNoMarginBottom __next40pxDefaultSize
                            label="Caption"
                            value={attributes.caption || ''}
                            onChange={(value) => setAttributes({caption: value})}
                        />
                        <TextControl __nextHasNoMarginBottom __next40pxDefaultSize
                            label={__('Date', 'latepoint')}
                            value={attributes.date || ''}
                            placeholder="YYYY-MM-DD"
                            onChange={(value) => setAttributes({date: value})}
                        />
                        <TextControl __nextHasNoMarginBottom __next40pxDefaultSize
                            label="Show Agents"
                            placeholder="Comma separated agent IDs"
                            value={attributes.show_agents || ''}
                            onChange={(value) => setAttributes({show_agents: value})}
                        />
                        <TextControl __nextHasNoMarginBottom __next40pxDefaultSize
                            label="Show Services"
                            placeholder="Comma separated service IDs"
                            value={attributes.show_services || ''}
                            onChange={(value) => setAttributes({show_services: value})}
                        />
                        <TextControl __nextHasNoMarginBottom __next40pxDefaultSize
                            label="Show Locations"
                            placeholder="Comma separated location IDs"
                            value={attributes.show_locations || ''}
                            onChange={(value) => setAttributes({show_locations: value})}
                        />

                        <SelectControl __nextHasNoMarginBottom __next40pxDefaultSize
                            label={__('View', 'latepoint')}
                            value={attributes.view || 'month'}
                            onChange={(value) => setAttributes({view: value})}
                            options={rangeTypes}
                        />
                    </PanelBody>
                </Panel>
            </InspectorControls>
            <IframeEmotionCacheProvider>
            <LatepointCalendarWrapper>
                <LatepointBlockCaption>{attributes.caption}</LatepointBlockCaption>
                <LatepointCalendar>
                    <LCHead>
                        <LCRow>
                            { weekCells('date') }
                        </LCRow>
                    </LCHead>

                    { range(1, 4).map(() => (
                        <LCRow>
                            { weekCells('text') }
                        </LCRow>
                    ))}

                </LatepointCalendar>

            </LatepointCalendarWrapper>
            </IframeEmotionCacheProvider>

        </div>
    );
}
