import { bookingPages } from '@/docs/content/bookings';
import { catalogPages } from '@/docs/content/catalog';
import { customerPortalPages } from '@/docs/content/customer-portal';
import { customerPages } from '@/docs/content/customers';
import { dashboardPages } from '@/docs/content/dashboard';
import { emailPages } from '@/docs/content/email';
import { fleetPages } from '@/docs/content/fleet';
import { gettingStartedPages } from '@/docs/content/getting-started';
import { locationPages } from '@/docs/content/locations';
import { reportPages } from '@/docs/content/reports';
import { settingsPages } from '@/docs/content/settings';
import { technicianPages } from '@/docs/content/technician';
import { uiPatternPages } from '@/docs/content/ui-patterns';
import { usersPluginsPages } from '@/docs/content/users-plugins';
import { websitePages } from '@/docs/content/website';
import { pageAccessible } from '@/docs/helpers';
import type { DocPage } from '@/docs/types';
import type { UserRole } from '@/types/auth';

export const docPages: DocPage[] = [
    ...gettingStartedPages,
    ...dashboardPages,
    ...bookingPages,
    ...reportPages,
    ...customerPages,
    ...customerPortalPages,
    ...locationPages,
    ...catalogPages,
    ...fleetPages,
    ...emailPages,
    ...technicianPages,
    ...websitePages,
    ...usersPluginsPages,
    ...settingsPages,
    ...uiPatternPages,
];

const pagesBySlug = new Map(docPages.map((page) => [page.slug, page]));

export function getDocPage(slug: string): DocPage | undefined {
    const normalized = slug.replace(/^\/+|\/+$/g, '');

    if (normalized === '') {
        return undefined;
    }

    return pagesBySlug.get(normalized);
}

export function getDocPagesForRole(role?: UserRole): DocPage[] {
    return docPages.filter((page) => pageAccessible(page, role));
}

export function isValidDocSlug(slug: string, role?: UserRole): boolean {
    const page = getDocPage(slug);

    if (!page) {
        return false;
    }

    return pageAccessible(page, role);
}

export function searchDocPages(
    query: string,
    role?: UserRole,
): DocPage[] {
    const term = query.trim().toLowerCase();

    if (term === '') {
        return getDocPagesForRole(role);
    }

    return getDocPagesForRole(role).filter((page) => {
        const haystack = [
            page.title,
            page.description,
            page.slug,
            ...page.sections.flatMap((section) => [
                section.heading,
                ...section.blocks.flatMap((block) => {
                    if (block.type === 'paragraph') {
                        return [block.text];
                    }

                    if (block.type === 'list') {
                        return block.items;
                    }

                    if (block.type === 'callout') {
                        return [block.text, block.title ?? ''];
                    }

                    if (block.type === 'cards') {
                        return block.items.flatMap((item) => [
                            item.title,
                            item.description,
                        ]);
                    }

                    return [];
                }),
            ]),
        ]
            .join(' ')
            .toLowerCase();

        return haystack.includes(term);
    });
}
