import Link from '@/Components/Link';
import { ChevronLeft, ChevronRight } from 'lucide-react';

interface PaginatorLink {
    url: string | null;
    label: string;
    active: boolean;
}

interface Props {
    /** Laravel paginator çıktısı — sadece links zorunlu, current/last yoksa links'ten çıkarılır */
    paginator: {
        current_page?: number;
        last_page?: number;
        links: PaginatorLink[];
    };
    /** Her iki yanda kaç sayfa link'i göster (default 1). 6'da [..3 4 5 6..] olur */
    onEachSide?: number;
}

/**
 * Compact pagination: < 1 ... 5 6 7 ... 30 >
 * Laravel paginator'un links array'inden URL'leri kullanır.
 * label === sayfa numarası. label === '«' (Previous) veya '»' (Next) iconlarla değiştirilir.
 */
export default function Pagination({ paginator, onEachSide = 1 }: Props) {
    const { links } = paginator;
    // current/last yoksa links'ten çıkar
    const sayfaLinkler = links.filter(l => /^\d+$/.test(l.label));
    const current = paginator.current_page ?? parseInt(sayfaLinkler.find(l => l.active)?.label || '1');
    const last = paginator.last_page ?? (sayfaLinkler.length ? parseInt(sayfaLinkler[sayfaLinkler.length - 1].label) : 1);
    if (last <= 1) return null;

    // Laravel paginator'unun her zaman: ilk eleman previous, son eleman next.
    // Aradakiler sayfa numaraları. Türkçe/İngilizce label'a güvenmiyoruz — pozisyon ile alıyoruz.
    const prevUrl: string | null = links[0]?.url ?? null;
    const nextUrl: string | null = links[links.length - 1]?.url ?? null;

    const urlMap = new Map<number, string | null>();
    for (let i = 1; i < links.length - 1; i++) {
        const l = links[i];
        const n = parseInt(l.label.replace(/[^\d]/g, ''));
        if (!isNaN(n)) urlMap.set(n, l.url);
    }

    // Görünür sayfa numaraları: 1 ... (current-onEachSide..current+onEachSide) ... last
    // current'ın HEM ÖNCESİ HEM SONRASI görünür ki kullanıcı geri dönebilsin.
    const sayfalar: (number | '...')[] = [];
    const baslangic = Math.max(1, current - onEachSide);
    const bitis = Math.min(last, current + onEachSide + 1); // current+1, +2 göster (sona doğru genişlet)

    // 1. sayfa her zaman görünsün (current uzaktaysa ... eklenir)
    if (baslangic > 1) {
        sayfalar.push(1);
        if (baslangic > 2) sayfalar.push('...');
    }

    for (let i = baslangic; i <= bitis; i++) sayfalar.push(i);

    if (bitis < last) {
        if (bitis < last - 1) sayfalar.push('...');
        sayfalar.push(last);
    }

    const ortakClass = 'inline-flex h-9 min-w-[36px] items-center justify-center rounded-md px-2 text-sm transition';

    return (
        <div className="flex items-center gap-1">
            {/* Previous */}
            <Link
                href={prevUrl ?? '#'}
                preserveScroll
                className={`${ortakClass} ${prevUrl ? 'text-slate-700 hover:bg-slate-100' : 'cursor-not-allowed text-slate-300'}`}
                aria-disabled={!prevUrl}
            >
                <ChevronLeft className="h-4 w-4" />
            </Link>

            {/* Sayfa numaraları */}
            {sayfalar.map((s, i) => {
                if (s === '...') {
                    return <span key={`e-${i}`} className={`${ortakClass} cursor-default text-slate-400`}>…</span>;
                }
                const url = urlMap.get(s);
                const isActive = s === current;
                return (
                    <Link
                        key={s}
                        href={url ?? '#'}
                        preserveScroll
                        className={`${ortakClass} ${isActive ? 'bg-blue-600 text-white' : url ? 'text-slate-700 hover:bg-slate-100' : 'cursor-not-allowed text-slate-300'}`}
                    >
                        {s}
                    </Link>
                );
            })}

            {/* Next */}
            <Link
                href={nextUrl ?? '#'}
                preserveScroll
                className={`${ortakClass} ${nextUrl ? 'text-slate-700 hover:bg-slate-100' : 'cursor-not-allowed text-slate-300'}`}
                aria-disabled={!nextUrl}
            >
                <ChevronRight className="h-4 w-4" />
            </Link>
        </div>
    );
}
