import type { DocNavGroup, DocNavItem } from '@/docs/types';
import type { UserRole } from '@/types/auth';

export const docsNavigation: DocNavGroup[] = [
    {
        label: 'Getting started',
        items: [
            { title: 'Overview', slug: 'getting-started/overview' },
            {
                title: 'Roles & permissions',
                slug: 'getting-started/roles',
                roles: ['admin', 'manager'],
            },
            { title: 'Navigation guide', slug: 'getting-started/navigation' },
        ],
    },
    {
        label: 'Dashboard',
        items: [{ title: 'Dashboard', slug: 'dashboard/overview' }],
    },
    {
        label: 'Bookings',
        roles: ['admin', 'manager'],
        items: [
            { title: 'Calendar & list', slug: 'bookings/calendar' },
            { title: 'Walk-in booking', slug: 'bookings/walk-in' },
            { title: 'Edit booking drawer', slug: 'bookings/edit-drawer' },
            { title: 'Payments', slug: 'bookings/payments' },
            { title: 'Recurring bookings', slug: 'bookings/recurring' },
            { title: 'Booking statuses', slug: 'bookings/statuses' },
        ],
    },
    {
        label: 'Reports',
        roles: ['admin', 'manager'],
        items: [{ title: 'Reports', slug: 'reports/overview' }],
    },
    {
        label: 'Customers',
        roles: ['admin', 'manager'],
        items: [
            { title: 'Customer list', slug: 'customers/list' },
            { title: 'Customer detail', slug: 'customers/detail' },
            { title: 'Customer portal', slug: 'customers/portal' },
            { title: 'Vehicles', slug: 'customers/vehicles' },
            { title: 'Memberships', slug: 'customers/memberships' },
        ],
    },
    {
        label: 'Locations',
        roles: ['admin', 'manager'],
        items: [
            { title: 'Locations', slug: 'locations/overview' },
            { title: 'Service zones', slug: 'locations/zones' },
            { title: 'Availability slots', slug: 'locations/availability' },
            { title: 'Technician assignment', slug: 'locations/technicians' },
        ],
    },
    {
        label: 'Catalog',
        roles: ['admin', 'manager'],
        items: [
            { title: 'Packages', slug: 'catalog/packages' },
            { title: 'Add-ons', slug: 'catalog/addons' },
            { title: 'Vehicle sizes & pricing', slug: 'catalog/vehicle-sizes' },
        ],
    },
    {
        label: 'Fleet',
        roles: ['admin', 'manager'],
        items: [{ title: 'Fleet accounts', slug: 'fleet/overview' }],
    },
    {
        label: 'Email',
        roles: ['admin', 'manager'],
        items: [
            { title: 'Templates & events', slug: 'email/templates' },
            { title: 'Sent log', slug: 'email/sent-log' },
            { title: 'Open & click tracking', slug: 'email/tracking' },
        ],
    },
    {
        label: 'Technician',
        items: [
            { title: 'Job list', slug: 'technician/jobs' },
            { title: 'Live board', slug: 'technician/live-board' },
            { title: 'Status updates', slug: 'technician/status-updates' },
            { title: 'Booking statuses', slug: 'bookings/statuses' },
        ],
    },
    {
        label: 'Website',
        roles: ['admin', 'manager'],
        items: [
            { title: 'Homepage layout', slug: 'website/homepage-layout' },
            { title: 'Homepage FAQs', slug: 'website/faqs' },
            { title: 'Online booking flow', slug: 'website/online-booking' },
            { title: 'Tracking & balance pay', slug: 'website/track-and-pay' },
        ],
    },
    {
        label: 'Users & plugins',
        roles: ['admin'],
        items: [
            { title: 'Staff users', slug: 'users/staff' },
            { title: 'Plugin registry', slug: 'users/plugins' },
        ],
    },
    {
        label: 'Settings',
        items: [
            { title: 'Profile', slug: 'settings/profile' },
            { title: 'Security & 2FA', slug: 'settings/security' },
            {
                title: 'Appearance & branding',
                slug: 'settings/appearance',
                roles: ['admin', 'manager'],
            },
            {
                title: 'Email SMTP',
                slug: 'settings/email-smtp',
                roles: ['admin', 'manager'],
            },
            {
                title: 'Booking policies',
                slug: 'settings/booking-policies',
                roles: ['admin', 'manager'],
            },
        ],
    },
    {
        label: 'UI patterns',
        items: [
            { title: 'Data tables', slug: 'ui-patterns/data-tables' },
            { title: 'Drawers & sheets', slug: 'ui-patterns/drawers' },
            { title: 'Status badges', slug: 'ui-patterns/status-badges' },
            {
                title: 'Global search',
                slug: 'ui-patterns/global-search',
                roles: ['admin', 'manager'],
            },
            {
                title: 'Notifications',
                slug: 'ui-patterns/notifications',
                roles: ['admin', 'manager'],
            },
        ],
    },
];

function navItemAccessible(item: DocNavItem, role?: UserRole): boolean {
    if (!item.roles || item.roles.length === 0) {
        return true;
    }

    if (!role) {
        return false;
    }

    return item.roles.includes(role);
}

function filterNavItems(
    items: DocNavItem[],
    role?: UserRole,
): DocNavItem[] {
    return items
        .filter((item) => navItemAccessible(item, role))
        .map((item) => ({
            ...item,
            children: item.children
                ? filterNavItems(item.children, role)
                : undefined,
        }));
}

export function getDocsNavigation(role?: UserRole): DocNavGroup[] {
    return docsNavigation
        .filter(
            (group) =>
                !group.roles ||
                group.roles.length === 0 ||
                (role && group.roles.includes(role)),
        )
        .map((group) => ({
            ...group,
            items: filterNavItems(group.items, role),
        }))
        .filter((group) => group.items.length > 0);
}

export function getTopLevelSectionCards(role?: UserRole): {
    title: string;
    description: string;
    slug: string;
}[] {
    const cards: { title: string; description: string; slug: string }[] = [];

    for (const group of getDocsNavigation(role)) {
        const firstItem = group.items.find((item) => item.slug);

        if (firstItem?.slug) {
            cards.push({
                title: group.label,
                description: `Guides for ${group.label.toLowerCase()}.`,
                slug: firstItem.slug,
            });
        }
    }

    return cards;
}
