const VirtualScrollerProps = [
    {
        name: 'id',
        type: 'string',
        default: 'null',
        description: 'Unique identifier of the element.'
    },
    {
        name: 'style',
        type: 'any',
        default: 'null',
        description: 'Inline style of the component.'
    },
    {
        name: 'class',
        type: 'string',
        default: 'null',
        description: 'Style class of the component.'
    },
    {
        name: 'items',
        type: 'array',
        default: 'null',
        description: 'An array of objects to display.'
    },
    {
        name: 'itemSize',
        type: 'number|array',
        default: 'null',
        description: 'The height/width of item according to orientation.'
    },
    {
        name: 'scrollHeight',
        type: 'string',
        default: 'null',
        description: 'Height of the scroll viewport.'
    },
    {
        name: 'scrollWidth',
        type: 'string',
        default: 'null',
        description: 'Width of the scroll viewport.'
    },
    {
        name: 'orientation',
        type: 'string',
        default: 'vertical',
        description: "The orientation of scrollbar, valid values are 'vertical', 'horizontal' and 'both'."
    },
    {
        name: 'numToleratedItems',
        type: 'number',
        default: 'null',
        description:
            'Determines how many additional elements to add to the DOM outside of the view. According to the scrolls made up and down, extra items are added in a certain algorithm in the form of multiples of this number. Default value is half the number of items shown in the view.'
    },
    {
        name: 'delay',
        type: 'number',
        default: '0',
        description: 'Delay in scroll before new data is loaded.'
    },
    {
        name: 'lazy',
        type: 'boolean',
        default: 'false',
        description: 'Defines if data is loaded and interacted with in lazy manner.'
    },
    {
        name: 'disabled',
        type: 'boolean',
        default: 'false',
        description: 'If disabled, the VirtualScroller feature is eliminated and the content is displayed directly.'
    },
    {
        name: 'loaderDisabled',
        type: 'boolean',
        default: 'false',
        description: 'Used to implement a custom loader instead of using the loader feature in the VirtualScroller.'
    },
    {
        name: 'loading',
        type: 'boolean',
        default: 'false',
        description: 'Whether the data is loaded.'
    },
    {
        name: 'showSpacer',
        type: 'boolean',
        default: 'true',
        description: 'Used to implement a custom spacer instead of using the spacer feature in the VirtualScroller.'
    },
    {
        name: 'showLoader',
        type: 'boolean',
        default: 'false',
        description: 'Whether to show loader.'
    },
    {
        name: 'tabindex',
        type: 'number|string',
        default: '0',
        description: 'Index of the element in tabbing order.'
    }
];

const VirtualScrollerEvents = [
    {
        name: 'scroll',
        description: 'Callback to invoke when scroll position changes.',
        arguments: [
            {
                name: 'event',
                type: 'any',
                description: 'Browser event.'
            }
        ]
    },
    {
        name: 'scroll-index-change',
        description: "Callback to invoke when scroll position and item's range in view changes.",
        arguments: [
            {
                name: 'event.first',
                type: 'number',
                description: 'First index of the new data range to be loaded.'
            },
            {
                name: 'event.last',
                type: 'number',
                description: 'Last index of the new data range to be loaded.'
            }
        ]
    },
    {
        name: 'lazy-load',
        description: 'Callback to invoke in lazy mode to load new data.',
        arguments: [
            {
                name: 'event.first',
                type: 'number',
                description: 'First index of the new data range to be loaded.'
            },
            {
                name: 'event.last',
                type: 'number',
                description: 'Last index of the new data range to be loaded.'
            }
        ]
    }
];

const VirtualScrollerSlots = [
    {
        name: 'item',
        description: 'Content for the item'
    },
    {
        name: 'content',
        description: 'Custom content for the component'
    },
    {
        name: 'loader',
        description: 'Custom content for the loader items'
    }
];

module.exports = {
    virtualscroller: {
        name: 'VirtualScroller',
        description: 'VirtualScroller is a performant approach to handle huge data efficiently.',
        props: VirtualScrollerProps,
        events: VirtualScrollerEvents,
        slots: VirtualScrollerSlots
    }
};
