import { Head, Link } from '@inertiajs/react';
import {
    ArrowUpRight,
    BookOpen,
    CheckCircle2,
    Clock,
    GraduationCap,
    Sparkles,
    Users,
} from 'lucide-react';
import { useState } from 'react';
import AppLayout from '@/layouts/app-layout';
import { cn } from '@/lib/utils';

type Category = { id: number; name: string; slug?: string } | null;

type EnrolledCourse = {
    id: number;
    status: 'active' | 'completed';
    course: {
        id: number;
        title: string;
        slug: string;
        thumbnail: string | null;
        duration_minutes: number;
        category: Category;
    };
    progress_percent: number;
    completed_lessons: number;
    total_lessons: number;
};

type SuggestedCourse = {
    id: number;
    title: string;
    slug: string;
    thumbnail: string | null;
    level: string;
    price_type: 'free' | 'paid';
    price: number;
    duration_minutes: number;
    enrollments_count: number;
    lessons_count: number;
    instructor: { id: number; name: string };
    category: Category;
};

type Props = {
    enrollments: EnrolledCourse[];
    suggestedCourses: SuggestedCourse[];
};

type FilterTab = 'all' | 'active' | 'completed';

const LEVEL_LABELS: Record<string, string> = {
    beginner: 'Pemula',
    intermediate: 'Menengah',
    advanced: 'Mahir',
};

const LEVEL_COLORS: Record<string, string> = {
    beginner: 'bg-teal-100 text-teal-600',
    intermediate: 'bg-amber-100 text-amber-600',
    advanced: 'bg-rose-100 text-rose-500',
};

function formatDuration(minutes: number): string {
    if (!minutes) return '';
    if (minutes < 60) return `${minutes} mnt`;
    const h = Math.floor(minutes / 60);
    const m = minutes % 60;
    return m > 0 ? `${h}j ${m}mnt` : `${h} jam`;
}

function formatPrice(price: number): string {
    return new Intl.NumberFormat('id-ID', {
        style: 'currency',
        currency: 'IDR',
        maximumFractionDigits: 0,
    }).format(price);
}

export default function MyCoursesIndex({ enrollments, suggestedCourses }: Props) {
    const [activeTab, setActiveTab] = useState<FilterTab>('all');

    const tabs: { key: FilterTab; label: string; count: number }[] = [
        { key: 'all', label: 'Semua', count: enrollments.length },
        { key: 'active', label: 'Aktif', count: enrollments.filter((e) => e.status === 'active').length },
        { key: 'completed', label: 'Selesai', count: enrollments.filter((e) => e.status === 'completed').length },
    ];

    const filtered = enrollments.filter((e) => {
        if (activeTab === 'active') return e.status === 'active';
        if (activeTab === 'completed') return e.status === 'completed';
        return true;
    });

    const hasEnrollments = enrollments.length > 0;

    return (
        <>
            <Head title="Kelas Saya" />

            <div className="min-h-screen bg-sky-50/40">
                <div className="mx-auto max-w-6xl px-5 py-8">
                    {/* ── My enrolled courses ─────────────────────────── */}
                    <section className="mb-10">
                        {/* Header */}
                        <div className="mb-6 flex items-end justify-between">
                            <div>
                                <h1 className="text-2xl font-bold text-slate-800">Kelas Saya</h1>
                                <p className="mt-0.5 text-sm text-slate-400">
                                    {hasEnrollments
                                        ? `${enrollments.length} kelas yang kamu ikuti`
                                        : 'Belum ada kelas yang diikuti'}
                                </p>
                            </div>
                        </div>

                        {hasEnrollments ? (
                            <>
                                {/* Tabs */}
                                <div className="mb-5 flex items-center gap-1.5">
                                    {tabs.map((tab) => (
                                        <button
                                            key={tab.key}
                                            onClick={() => setActiveTab(tab.key)}
                                            className={cn(
                                                'flex items-center gap-1.5 rounded-full px-4 py-1.5 text-sm font-medium transition-all',
                                                activeTab === tab.key
                                                    ? 'bg-sky-400 text-white shadow-sm shadow-sky-200'
                                                    : 'border border-sky-100 bg-white text-slate-500 hover:bg-sky-50 hover:text-slate-700',
                                            )}
                                        >
                                            {tab.label}
                                            <span
                                                className={cn(
                                                    'rounded-full px-1.5 py-0.5 text-xs leading-none',
                                                    activeTab === tab.key
                                                        ? 'bg-white/25 text-white'
                                                        : 'bg-sky-50 text-slate-400',
                                                )}
                                            >
                                                {tab.count}
                                            </span>
                                        </button>
                                    ))}
                                </div>

                                {/* Enrolled cards grid */}
                                {filtered.length === 0 ? (
                                    <div className="rounded-2xl border border-dashed border-sky-200 bg-white py-12 text-center">
                                        <p className="text-sm text-slate-400">
                                            {activeTab === 'completed'
                                                ? 'Belum ada kelas selesai'
                                                : 'Tidak ada kelas aktif'}
                                        </p>
                                    </div>
                                ) : (
                                    <div className="grid gap-5 sm:grid-cols-2 lg:grid-cols-3">
                                        {filtered.map((item) => {
                                            const isCompleted = item.status === 'completed';
                                            return (
                                                <Link
                                                    key={item.id}
                                                    href={`/my-courses/${item.course.slug}`}
                                                    className="group flex flex-col overflow-hidden rounded-2xl border border-sky-100 bg-white shadow-sm shadow-sky-50 transition-all hover:-translate-y-0.5 hover:border-sky-200 hover:shadow-md hover:shadow-sky-100"
                                                >
                                                    {/* Thumbnail */}
                                                    <div className="relative overflow-hidden">
                                                        {item.course.thumbnail ? (
                                                            <img
                                                                src={item.course.thumbnail}
                                                                alt={item.course.title}
                                                                className="h-40 w-full object-cover transition-transform duration-500 group-hover:scale-105"
                                                            />
                                                        ) : (
                                                            <div className="flex h-40 w-full items-center justify-center bg-gradient-to-br from-sky-100 to-sky-200">
                                                                <GraduationCap className="h-10 w-10 text-sky-300" />
                                                            </div>
                                                        )}

                                                        {/* Status badge */}
                                                        <div
                                                            className={cn(
                                                                'absolute top-3 right-3 flex items-center gap-1 rounded-full px-2.5 py-1 text-xs font-semibold',
                                                                isCompleted
                                                                    ? 'bg-teal-200 text-teal-800'
                                                                    : 'bg-sky-400/90 text-white backdrop-blur-sm',
                                                            )}
                                                        >
                                                            {isCompleted && <CheckCircle2 className="h-3 w-3" />}
                                                            {isCompleted ? 'Selesai' : 'Aktif'}
                                                        </div>

                                                        {/* Progress bar overlay */}
                                                        <div className="absolute right-0 bottom-0 left-0 h-1 bg-black/10">
                                                            <div
                                                                className={cn(
                                                                    'h-full transition-all',
                                                                    isCompleted ? 'bg-teal-300' : 'bg-sky-300',
                                                                )}
                                                                style={{ width: `${item.progress_percent}%` }}
                                                            />
                                                        </div>
                                                    </div>

                                                    {/* Body */}
                                                    <div className="flex flex-1 flex-col p-4">
                                                        {item.course.category && (
                                                            <span className="mb-1 text-xs font-medium text-sky-500">
                                                                {item.course.category.name}
                                                            </span>
                                                        )}
                                                        <h3 className="line-clamp-2 text-sm font-semibold leading-snug text-slate-700 transition-colors group-hover:text-sky-600">
                                                            {item.course.title}
                                                        </h3>

                                                        {/* Progress info */}
                                                        <div className="mt-3">
                                                            <div className="mb-1.5 flex items-center justify-between text-xs text-slate-400">
                                                                <span className="flex items-center gap-1">
                                                                    <BookOpen className="h-3 w-3" />
                                                                    {item.completed_lessons}/{item.total_lessons} pelajaran
                                                                </span>
                                                                <span
                                                                    className={cn(
                                                                        'font-semibold',
                                                                        isCompleted ? 'text-teal-500' : 'text-sky-500',
                                                                    )}
                                                                >
                                                                    {item.progress_percent}%
                                                                </span>
                                                            </div>
                                                            <div className="h-1.5 overflow-hidden rounded-full bg-sky-100">
                                                                <div
                                                                    className={cn(
                                                                        'h-full rounded-full transition-all',
                                                                        isCompleted ? 'bg-teal-300' : 'bg-sky-300',
                                                                    )}
                                                                    style={{ width: `${item.progress_percent}%` }}
                                                                />
                                                            </div>
                                                        </div>

                                                        {/* CTA */}
                                                        <div className="mt-auto pt-4">
                                                            <div
                                                                className={cn(
                                                                    'flex w-full items-center justify-center gap-1.5 rounded-xl py-2 text-sm font-semibold transition-all',
                                                                    isCompleted
                                                                        ? 'bg-teal-100 text-teal-700 group-hover:bg-teal-200'
                                                                        : 'bg-sky-400 text-white shadow-sm shadow-sky-200 group-hover:bg-sky-500',
                                                                )}
                                                            >
                                                                {isCompleted ? 'Lihat Kembali' : 'Lanjutkan Belajar'}
                                                                <ArrowUpRight className="h-3.5 w-3.5" />
                                                            </div>
                                                        </div>
                                                    </div>
                                                </Link>
                                            );
                                        })}
                                    </div>
                                )}
                            </>
                        ) : (
                            /* Empty hero — pastel */
                            <div className="relative overflow-hidden rounded-3xl border border-sky-100 bg-gradient-to-br from-sky-100 to-sky-50 px-8 py-12 text-center">
                                <div className="absolute -top-8 -right-8 h-40 w-40 rounded-full bg-sky-200/40" />
                                <div className="absolute -bottom-10 -left-6 h-32 w-32 rounded-full bg-sky-200/40" />
                                <div className="relative">
                                    <div className="mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-2xl bg-sky-200 shadow-sm shadow-sky-200">
                                        <GraduationCap className="h-8 w-8 text-sky-600" />
                                    </div>
                                    <h2 className="text-xl font-bold text-sky-800">Mulai Belajar Sekarang!</h2>
                                    <p className="mt-2 text-sm text-sky-600">
                                        Pilih kelas di bawah dan tingkatkan skillmu bersama ribuan pelajar lainnya.
                                    </p>
                                </div>
                            </div>
                        )}
                    </section>

                    {/* ── Divider ─────────────────────────────────────── */}
                    {suggestedCourses.length > 0 && (
                        <div className="mb-8 flex items-center gap-4">
                            <div className="h-px flex-1 bg-sky-100" />
                            <span className="flex items-center gap-1.5 text-xs font-semibold uppercase tracking-widest text-slate-400">
                                <Sparkles className="h-3.5 w-3.5 text-sky-400" />
                                {hasEnrollments ? 'Kelas Lainnya' : 'Pilih Kelasmu'}
                            </span>
                            <div className="h-px flex-1 bg-sky-100" />
                        </div>
                    )}

                    {/* ── Suggested courses ─────────────────────────── */}
                    {suggestedCourses.length > 0 && (
                        <section>
                            <div className="mb-5 flex items-center justify-between">
                                <h2 className="text-lg font-bold text-slate-700">
                                    {hasEnrollments ? 'Kelas yang Mungkin Kamu Suka' : 'Semua Kelas Tersedia'}
                                </h2>
                                <Link
                                    href="/courses"
                                    className="text-sm font-medium text-sky-500 transition-colors hover:text-sky-600"
                                >
                                    Lihat semua →
                                </Link>
                            </div>

                            <div className="grid gap-5 sm:grid-cols-2 lg:grid-cols-3">
                                {suggestedCourses.map((course) => (
                                    <Link
                                        key={course.id}
                                        href={`/courses/${course.slug}`}
                                        className="group flex flex-col overflow-hidden rounded-2xl border border-sky-100 bg-white shadow-sm shadow-sky-50 transition-all hover:-translate-y-0.5 hover:border-sky-200 hover:shadow-md hover:shadow-sky-100"
                                    >
                                        {/* Thumbnail */}
                                        <div className="relative overflow-hidden">
                                            {course.thumbnail ? (
                                                <img
                                                    src={course.thumbnail}
                                                    alt={course.title}
                                                    className="h-40 w-full object-cover transition-transform duration-500 group-hover:scale-105"
                                                />
                                            ) : (
                                                <div className="flex h-40 w-full items-center justify-center bg-gradient-to-br from-sky-100 to-sky-200">
                                                    <BookOpen className="h-10 w-10 text-sky-300" />
                                                </div>
                                            )}
                                        </div>

                                        {/* Body */}
                                        <div className="flex flex-1 flex-col p-4">
                                            {/* Category + Level */}
                                            <div className="mb-2 flex items-center gap-1.5">
                                                {course.category && (
                                                    <span className="rounded-full bg-sky-100 px-2.5 py-0.5 text-xs font-medium text-sky-600">
                                                        {course.category.name}
                                                    </span>
                                                )}
                                                <span
                                                    className={cn(
                                                        'rounded-full px-2 py-0.5 text-xs font-medium',
                                                        LEVEL_COLORS[course.level] ?? 'bg-slate-100 text-slate-500',
                                                    )}
                                                >
                                                    {LEVEL_LABELS[course.level] ?? course.level}
                                                </span>
                                            </div>

                                            {/* Title */}
                                            <h3 className="line-clamp-2 text-sm font-semibold leading-snug text-slate-700 transition-colors group-hover:text-sky-600">
                                                {course.title}
                                            </h3>

                                            {/* Instructor */}
                                            <p className="mt-1.5 text-xs text-slate-400">{course.instructor.name}</p>

                                            {/* Price */}
                                            <div className="mt-2.5">
                                                <span className="text-base font-bold text-sky-600">
                                                    {course.price_type === 'free' ? 'Gratis' : formatPrice(course.price)}
                                                </span>
                                            </div>

                                            {/* Stats */}
                                            <div className="mt-2.5 flex items-center gap-3 text-xs text-slate-400">
                                                <span className="flex items-center gap-1">
                                                    <BookOpen className="h-3 w-3" />
                                                    {course.lessons_count} lesson
                                                </span>
                                                {course.duration_minutes > 0 && (
                                                    <span className="flex items-center gap-1">
                                                        <Clock className="h-3 w-3" />
                                                        {formatDuration(course.duration_minutes)}
                                                    </span>
                                                )}
                                                <span className="flex items-center gap-1">
                                                    <Users className="h-3 w-3" />
                                                    {course.enrollments_count.toLocaleString('id-ID')}
                                                </span>
                                            </div>

                                            {/* CTA */}
                                            <div className="mt-auto pt-4">
                                                <div className="flex w-full items-center justify-center gap-1.5 rounded-xl bg-sky-400 py-2 text-sm font-semibold text-white shadow-sm shadow-sky-200 transition-all group-hover:bg-sky-500">
                                                    Lihat Detail
                                                    <ArrowUpRight className="h-3.5 w-3.5" />
                                                </div>
                                            </div>
                                        </div>
                                    </Link>
                                ))}
                            </div>
                        </section>
                    )}
                </div>
            </div>
        </>
    );
}

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