import { type ExplorePageProps } from '@/types/explore';
import { Head, usePage } from '@inertiajs/react';
import { useLaravelReactI18n } from 'laravel-react-i18n';
import AppLayout from '@/layouts/app-layout';
import ExploreFilters from '@/components/explore/explore-filters';
import ExploreGrid from '@/components/explore/explore-grid';
import ExploreMap from '@/components/explore/explore-map';
import MobileViewToggle from '@/components/explore/mobile-view-toggle';
import { useExploreState } from '@/hooks/use-explore-state';
import { Pagination, PaginationContent, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, PaginationEllipsis } from '@/components/ui/pagination';

export default function Index() {
    const { items, categories, filters } = usePage<ExplorePageProps>().props;
    const { t } = useLaravelReactI18n();

    const {
        search,
        category,
        selectedItemId,
        hoveredItemId,
        isMapView,
        setSearch,
        setCategory,
        setBounds,
        setSelectedItemId,
        setHoveredItemId,
        setIsMapView,
        clearFilters,
    } = useExploreState({
        initialSearch: filters.search,
        initialCategory: filters.category,
        initialBounds: filters.bounds,
    });

    const generatePaginationRange = () => {
        const current = items.current_page;
        const last = items.last_page;
        const range: number[] = [];

        if (last <= 7) {
            for (let i = 1; i <= last; i++) {
                range.push(i);
            }
        } else {
            if (current <= 4) {
                for (let i = 1; i <= 5; i++) {
                    range.push(i);
                }
                range.push(-1, last);
            } else if (current >= last - 3) {
                range.push(1, -1);
                for (let i = last - 4; i <= last; i++) {
                    range.push(i);
                }
            } else {
                range.push(1, -1, current - 1, current, current + 1, -1, last);
            }
        }

        return range;
    };

    return (
        <AppLayout>
            <Head title={`${t('Explore')} - Smartsense`} />

            {/* Mobile View Toggle - Positioned at top right */}
            <MobileViewToggle isMapView={isMapView} onToggle={setIsMapView} />

            <div className="h-[calc(100vh-4rem)] bg-gradient-to-b from-blue-50/30 via-white to-white dark:from-blue-950/20 dark:via-background dark:to-background overflow-hidden relative z-0">
                {/* Main Content - Two Column Layout */}
                <section className="h-full w-full">
                    <div className="flex flex-col lg:flex-row gap-0 h-full">
                        {/* Left Column - Filters & Grid (50%) with scroll */}
                        <div className={`lg:w-1/2 ${isMapView ? 'hidden lg:block' : 'block'} h-full overflow-y-auto transition-all duration-300 ease-in-out`}>
                            {/* Sticky Filters */}
                            <div className="sticky top-0 z-10 bg-white/95 dark:bg-background/95 backdrop-blur-sm border-b border-gray-200/50 dark:border-gray-800/50 px-4 py-4">
                                <ExploreFilters
                                    search={search}
                                    category={category}
                                    categories={categories}
                                    onSearchChange={setSearch}
                                    onCategoryChange={setCategory}
                                    onClearFilters={clearFilters}
                                />

                                <div className="mt-4">
                                    <p className="text-sm text-muted-foreground">
                                        {t('Showing')} <span className="font-semibold text-foreground">{items.from}-{items.to}</span> {t('of')} <span className="font-semibold text-foreground">{items.total}</span> {t('results')}
                                    </p>
                                </div>
                            </div>

                            {/* Scrollable Grid Content */}
                            <div className="px-4 py-4">

                            <ExploreGrid
                                items={items.data}
                                selectedItemId={selectedItemId}
                                hoveredItemId={hoveredItemId}
                                onItemHover={setHoveredItemId}
                                onItemClick={(id) => {
                                    setSelectedItemId(id);
                                    const item = items.data.find(i => i.id === id);
                                    if (item) {
                                        // Navigate to detail page
                                        const url = item.type === 'experience'
                                            ? `/experiences/${id}`
                                            : `/points-of-interest/${id}`;
                                        window.location.href = url;
                                    }
                                }}
                            />

                            {/* Pagination */}
                            {items.last_page > 1 && (
                                <div className="flex justify-center mt-8 mb-8">
                                    <Pagination>
                                        <PaginationContent className="bg-white/60 dark:bg-background/60 backdrop-blur-sm border-0 shadow-lg rounded-lg p-1">
                                            {items.prev_page_url && (
                                                <PaginationItem>
                                                    <PaginationPrevious
                                                        href={items.prev_page_url}
                                                        className="hover:bg-blue-50 dark:hover:bg-blue-900/20"
                                                    />
                                                </PaginationItem>
                                            )}

                                            {generatePaginationRange().map((page, index) => (
                                                <PaginationItem key={index}>
                                                    {page === -1 ? (
                                                        <PaginationEllipsis />
                                                    ) : (
                                                        <PaginationLink
                                                            href={`${items.path}?page=${page}`}
                                                            isActive={page === items.current_page}
                                                            className={page === items.current_page
                                                                ? "bg-gradient-to-r from-blue-600 to-purple-600 text-white hover:from-blue-700 hover:to-purple-700"
                                                                : "hover:bg-blue-50 dark:hover:bg-blue-900/20"
                                                            }
                                                        >
                                                            {page}
                                                        </PaginationLink>
                                                    )}
                                                </PaginationItem>
                                            ))}

                                            {items.next_page_url && (
                                                <PaginationItem>
                                                    <PaginationNext
                                                        href={items.next_page_url}
                                                        className="hover:bg-blue-50 dark:hover:bg-blue-900/20"
                                                    />
                                                </PaginationItem>
                                            )}
                                        </PaginationContent>
                                    </Pagination>
                                </div>
                            )}
                            </div>
                        </div>

                        {/* Right Column - Map (50%, Fixed Height) */}
                        <div className={`lg:w-1/2 ${!isMapView ? 'hidden lg:block' : 'block'} h-full transition-all duration-300 ease-in-out`}>
                            <ExploreMap
                                items={items.data}
                                selectedItemId={selectedItemId}
                                hoveredItemId={hoveredItemId}
                                isVisible={isMapView}
                                onBoundsChange={setBounds}
                                onMarkerHover={setHoveredItemId}
                                onMarkerClick={setSelectedItemId}
                            />
                        </div>
                    </div>
                </section>

            </div>
        </AppLayout>
    );
}
