---
import type { Page } from 'astro';

interface PageWithDepreciatedKeys extends Page { current: number, last: number }

export interface Props {
    data: any[];
    size?: string | number;
    page: string | number;
    debug?: boolean;
}

const {
    data=[],
    size=10,
    page=1,
    debug
} = Astro.props

const pathname = Astro.url.pathname.replace(/\/$/, '')

const lastPage = Math.max(1, Math.ceil(data.length / +size))

const createRelativeURL = (difference: number) =>
    pathname.replace(/\/\d+\/?$/, '') + `/${+page + difference}`

const pages = [...Array(lastPage).keys()].map((n) => {
    const num = n + 1;
    const start = +size === Infinity ? 0 : (num - 1) * +size;
    const end = Math.min(start + +size, data.length);
    return {
        data: data.slice(start, end),
        start,
        end: end - 1,
        size: +size,
        total: data.length,
        currentPage: num,
        current: num, // Depreceated, remove when 0.1.0 releases
        lastPage,
        last: lastPage,  // Depreceated, remove when 0.1.0 releases
        url: {
            current: pathname,
            prev: (num && num !== 1 && createRelativeURL(-1)) || undefined,
            next: (num && num !== lastPage && createRelativeURL(1)) || undefined,
        }
    } as PageWithDepreciatedKeys
})

if (debug) console.log(pages[+page - 1])
---
{_ => {
    if (!Number.isInteger(+page) || +page > lastPage) return <Fragment set:html={Astro.slots.render('error', [pages.pop()])}/>
    if (Astro.slots.has(''+page)) return <Fragment set:html={Astro.slots.render(''+page, [pages[+page - 1]])}/>
    return <Fragment set:html={Astro.slots.render('default', [pages[+page - 1]])}/>
}}