import { Head, Link } from '@inertiajs/react';
import { Crown, Medal, Trophy, ArrowLeft, ArrowUpRight, Zap, Target } from 'lucide-react';
import AppLayout from '@/layouts/app-layout';
import type { BreadcrumbItem } from '@/types';
import { cn } from '@/lib/utils';

type Entry = {
    rank: number;
    id: number;
    name: string;
    points: number;
    avatar: string | null;
    isMe: boolean;
};

type Props = {
    top: Entry[];
    myRank: number;
    myPoints: number;
};

const breadcrumbs: BreadcrumbItem[] = [{ title: 'Leaderboard', href: '/leaderboard' }];

function Avatar({ name, avatar, size = '10' }: { name: string; avatar: string | null; size?: string }) {
    const sizeClasses = {
        '10': 'h-10 w-10 text-sm',
        '12': 'h-12 w-12 text-base',
        '16': 'h-16 w-16 text-xl',
    }[size] || 'h-10 w-10 text-sm';

    if (avatar) {
        return <img src={avatar} alt={name} className={cn('rounded-full object-cover border-2 border-white shadow-sm', sizeClasses)} />;
    }
    return (
        <div className={cn('flex items-center justify-center rounded-full bg-blue-50 text-blue-600 font-bold border-2 border-white shadow-sm', sizeClasses)}>
            {name[0].toUpperCase()}
        </div>
    );
}

export default function LeaderboardIndex({ top, myRank, myPoints }: Props) {
    const rank1 = top.find((e) => e.rank === 1);
    const rank2 = top.find((e) => e.rank === 2);
    const rank3 = top.find((e) => e.rank === 3);
    const remaining = top.filter((e) => e.rank > 3);

    return (
        <>
            <Head title="Leaderboard" />

            <div className="mx-auto max-w-4xl px-4 py-8">
                {/* Header */}
                <div className="mb-8 flex flex-col md:flex-row md:items-center md:justify-between gap-4">
                    <div>
                        <div className="flex items-center gap-2 text-sm text-blue-600 font-semibold mb-1">
                            <Trophy className="h-4 w-4" />
                            <span>Peringkat Siswa</span>
                        </div>
                        <h1 className="text-3xl font-extrabold tracking-tight text-gray-900">Leaderboard</h1>
                        <p className="mt-1 text-sm text-gray-500">
                            Ayo tingkatkan belajarmu dan jadilah yang terbaik di kelas!
                        </p>
                    </div>

                    {/* My Stats Card */}
                    <div className="flex items-center gap-4 bg-sky-50 border border-sky-100 text-sky-900 rounded-2xl p-4 shadow-xs min-w-[240px]">
                        <div className="flex h-12 w-12 items-center justify-center rounded-xl bg-sky-100/70 text-sky-700">
                            <Target className="h-6 w-6" />
                        </div>
                        <div className="flex-1">
                            <p className="text-[11px] font-semibold text-sky-600/90 uppercase tracking-wider">Posisimu Saat Ini</p>
                            <div className="flex items-baseline gap-1.5 mt-0.5">
                                <span className="text-2xl font-black text-sky-900">#{myRank}</span>
                                <span className="text-xs text-sky-600 font-semibold">({myPoints.toLocaleString('id-ID')} pts)</span>
                            </div>
                        </div>
                    </div>
                </div>

                {/* Top 3 Podium section */}
                {top.length > 0 && (
                    <div className="mb-10 bg-white rounded-3xl p-6 border border-gray-100 shadow-sm">
                        <div className="flex items-end justify-center gap-4 md:gap-8 pt-8 pb-4 max-w-md mx-auto">
                            {/* Rank 2 */}
                            {rank2 && (
                                <div className="flex flex-col items-center flex-1">
                                    <div className="relative mb-3">
                                        <Avatar name={rank2.name} avatar={rank2.avatar} size="12" />
                                        <div className="absolute -bottom-1.5 -right-1.5 flex h-6 w-6 items-center justify-center rounded-full bg-slate-200 border-2 border-white shadow-sm text-xs font-bold text-slate-700">
                                            2
                                        </div>
                                    </div>
                                    <p className="text-xs font-semibold text-gray-800 text-center truncate w-24">
                                        {rank2.name}
                                    </p>
                                    <span className="text-[10px] text-gray-400 font-medium mt-0.5">
                                        {rank2.points.toLocaleString('id-ID')} pts
                                    </span>
                                    <div className="w-full bg-slate-50 border border-slate-100 rounded-t-xl mt-3 h-20 flex flex-col items-center justify-center shadow-inner">
                                        <Trophy className="h-6 w-6 text-slate-400 mb-1" />
                                    </div>
                                </div>
                            )}

                            {/* Rank 1 */}
                            {rank1 && (
                                <div className="flex flex-col items-center flex-1 transform -translate-y-4">
                                    <div className="relative mb-3">
                                        <div className="absolute -top-6 left-1/2 transform -translate-x-1/2">
                                            <Crown className="h-7 w-7 text-amber-400 animate-bounce" />
                                        </div>
                                        <Avatar name={rank1.name} avatar={rank1.avatar} size="16" />
                                        <div className="absolute -bottom-1.5 -right-1.5 flex h-7 w-7 items-center justify-center rounded-full bg-amber-400 border-2 border-white shadow-md text-xs font-bold text-amber-950">
                                            1
                                        </div>
                                    </div>
                                    <p className="text-sm font-bold text-gray-900 text-center truncate w-28">
                                        {rank1.name}
                                    </p>
                                    <span className="text-xs text-amber-600 font-bold mt-0.5">
                                        {rank1.points.toLocaleString('id-ID')} pts
                                    </span>
                                    <div className="w-full bg-gradient-to-b from-amber-50 to-amber-100/50 border border-amber-200/60 rounded-t-2xl mt-3 h-28 flex flex-col items-center justify-center shadow-md relative overflow-hidden">
                                        <div className="absolute inset-0 bg-[radial-gradient(ellipse_at_center,_var(--tw-gradient-stops))] from-white/40 via-transparent to-transparent pointer-events-none" />
                                        <Trophy className="h-8 w-8 text-amber-500 drop-shadow-sm" />
                                    </div>
                                </div>
                            )}

                            {/* Rank 3 */}
                            {rank3 && (
                                <div className="flex flex-col items-center flex-1">
                                    <div className="relative mb-3">
                                        <Avatar name={rank3.name} avatar={rank3.avatar} size="12" />
                                        <div className="absolute -bottom-1.5 -right-1.5 flex h-6 w-6 items-center justify-center rounded-full bg-amber-600 border-2 border-white shadow-sm text-xs font-bold text-amber-50">
                                            3
                                        </div>
                                    </div>
                                    <p className="text-xs font-semibold text-gray-800 text-center truncate w-24">
                                        {rank3.name}
                                    </p>
                                    <span className="text-[10px] text-gray-400 font-medium mt-0.5">
                                        {rank3.points.toLocaleString('id-ID')} pts
                                    </span>
                                    <div className="w-full bg-amber-50/40 border border-amber-100/30 rounded-t-xl mt-3 h-16 flex flex-col items-center justify-center shadow-inner">
                                        <Medal className="h-6 w-6 text-amber-700 mb-1" />
                                    </div>
                                </div>
                            )}
                        </div>
                    </div>
                )}

                {/* Leaderboard List */}
                <div className="bg-white rounded-3xl border border-gray-100 shadow-sm overflow-hidden">
                    <div className="px-6 py-4 border-b border-gray-50 bg-gray-50/50">
                        <h3 className="text-sm font-bold text-gray-800">Daftar Peringkat</h3>
                    </div>
                    
                    <div className="divide-y divide-gray-50 max-h-[500px] overflow-y-auto">
                        {remaining.map((entry) => (
                            <div
                                key={entry.id}
                                className={cn(
                                    'flex items-center gap-4 px-6 py-4 transition-all',
                                    entry.isMe ? 'bg-blue-50/60 border-l-4 border-blue-500 font-semibold' : 'hover:bg-gray-50/50'
                                )}
                            >
                                <span className="w-6 text-center text-xs font-bold text-gray-400">
                                    {entry.rank}
                                </span>

                                <Avatar name={entry.name} avatar={entry.avatar} size="10" />

                                <div className="flex-1 min-w-0">
                                    <p className={cn('text-sm text-gray-800 truncate', entry.isMe && 'text-blue-700 font-bold')}>
                                        {entry.name}
                                        {entry.isMe && (
                                            <span className="ml-2 rounded-full bg-blue-100 px-2 py-0.5 text-[10px] font-bold text-blue-800">
                                                Kamu
                                            </span>
                                        )}
                                    </p>
                                </div>

                                <div className="shrink-0 text-right">
                                    <span className="text-sm font-bold text-gray-900">
                                        {entry.points.toLocaleString('id-ID')}
                                    </span>
                                    <span className="text-xs text-gray-400 ml-1">pts</span>
                                </div>
                            </div>
                        ))}

                        {top.length === 0 && (
                            <div className="p-8 text-center text-gray-400 text-sm">
                                Belum ada data peringkat saat ini.
                            </div>
                        )}
                    </div>
                </div>
            </div>
        </>
    );
}

LeaderboardIndex.layout = (page: React.ReactNode) => (
    <AppLayout breadcrumbs={breadcrumbs}>{page}</AppLayout>
);
