import AdminLayout from '@/layouts/admin/layout';
import { type BreadcrumbItem } from '@/types';
import { Head, router } from '@inertiajs/react';
import { ContentCard } from '@/components/ui/content-card';
import { ClassIcon } from '@/components/game/class-icon';
import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Link } from '@inertiajs/react';
import { Users, Activity, Search, Loader2, List } from 'lucide-react';
import { useState, FormEventHandler } from 'react';

const breadcrumbs: BreadcrumbItem[] = [
    {
        title: 'Dashboard',
        href: '/admin',
    },
    {
        title: 'Online Players',
        href: '/admin/online',
    },
];

type OnlinePlayer = {
    id: number;
    name: string;
    user_id: number;
    class: number;
    class_name: string;
    level: number;
    level2: number;
    gender: number;
    faction_name: string | null;
};

type OnlinePlayersProps = {
    onlinePlayers: OnlinePlayer[];
    count: number;
    loaded: boolean;
    searchQuery?: string;
};

export default function OnlinePlayers({ onlinePlayers, count, loaded, searchQuery }: OnlinePlayersProps) {
    const [search, setSearch] = useState(searchQuery ?? '');
    const [loading, setLoading] = useState(false);

    const handleLoadAll: FormEventHandler = (e) => {
        e.preventDefault();
        setLoading(true);
        router.get(route('admin.online'), { load: true }, {
            onFinish: () => setLoading(false),
        });
    };

    const handleSearch: FormEventHandler = (e) => {
        e.preventDefault();
        if (!search.trim()) return;
        setLoading(true);
        router.get(route('admin.online'), { search: search.trim() }, {
            onFinish: () => setLoading(false),
        });
    };

    return (
        <AdminLayout breadcrumbs={breadcrumbs}>
            <Head title="Online Players" />

            <div className="space-y-4">
                <div>
                    <h2 className="text-1xl font-bold tracking-tight flex items-center gap-2">
                        <Activity className="h-8 w-8 text-green-500" />
                        Online Players
                    </h2>
                    <p className="text-muted-foreground text-sm mt-1">Search or load all online players</p>
                </div>

                <ContentCard
                    title="Find Players"
                    description="Search by name or load all online players">
                    <div className="space-y-4">
                        <form onSubmit={handleSearch} className="flex gap-2">
                            <Input
                                placeholder="Search player name..."
                                value={search}
                                onChange={(e) => setSearch(e.target.value)}
                                className="flex-1"
                            />
                            <Button type="submit" disabled={loading || !search.trim()}>
                                {loading ? (
                                    <Loader2 className="h-4 w-4 animate-spin" />
                                ) : (
                                    <>
                                        <Search className="h-4 w-4 mr-1" />
                                        Search
                                    </>
                                )}
                            </Button>
                        </form>

                        <div className="flex items-center gap-2">
                            <div className="flex-1 border-t" />
                            <span className="text-muted-foreground text-xs">or</span>
                            <div className="flex-1 border-t" />
                        </div>

                        <form onSubmit={handleLoadAll}>
                            <Button type="submit" disabled={loading} className="w-full">
                                {loading ? (
                                    <Loader2 className="h-4 w-4 animate-spin mr-1" />
                                ) : (
                                    <List className="h-4 w-4 mr-1" />
                                )}
                                {loading ? 'Loading...' : 'Load All Online Players'}
                            </Button>
                        </form>
                    </div>
                </ContentCard>

                {loaded && (
                    <ContentCard
                        title={`Results — ${count} Player${count !== 1 ? 's' : ''}`}
                        description={searchQuery ? `Search results for "${searchQuery}"` : 'All online players'}>
                        {count === 0 ? (
                            <div className="flex flex-col items-center justify-center py-12 text-center">
                                <Users className="h-12 w-12 text-muted-foreground mb-4" />
                                <p className="text-lg font-medium text-muted-foreground">
                                    {searchQuery ? `No players found matching "${searchQuery}"` : 'No players online'}
                                </p>
                                <p className="text-sm text-muted-foreground">
                                    {searchQuery ? 'Try a different search term' : 'Check back later'}
                                </p>
                            </div>
                        ) : (
                            <div className="space-y-2">
                                {onlinePlayers.map((player) => (
                                    <div
                                        key={player.id}
                                        className="flex items-center justify-between p-3 rounded-lg border bg-card hover:bg-accent/50 transition-colors"
                                    >
                                        <div className="flex items-center gap-4">
                                            <ClassIcon
                                                classId={player.class}
                                                size="lg"
                                            />
                                            <div>
                                                <div className="flex items-center gap-2">
                                                    <Link
                                                        href={`/admin/manage/characters/${player.id}`}
                                                        className="font-medium hover:underline"
                                                    >
                                                        {player.name}
                                                    </Link>
                                                    <Badge variant="outline" className="text-xs">
                                                        {player.class_name}
                                                    </Badge>
                                                </div>
                                                <p className="text-sm text-muted-foreground">
                                                    {player.faction_name ? player.faction_name : 'None Faction'}
                                                </p>
                                            </div>
                                        </div>
                                        <div className="flex items-center gap-4">
                                            <div className="text-right">
                                                <p className="text-sm font-medium">
                                                    Level {player.level}
                                                    {player.level2 > 0 && (
                                                        <span className="text-muted-foreground"> / {player.level2}</span>
                                                    )}
                                                </p>
                                                <p className="text-xs text-muted-foreground">
                                                    {player.gender === 0 ? 'Male' : 'Female'}
                                                </p>
                                            </div>
                                            <Badge variant="default" className="bg-green-500 hover:bg-green-600">
                                                <Activity className="h-3 w-3 mr-1" />
                                                Online
                                            </Badge>
                                        </div>
                                    </div>
                                ))}
                            </div>
                        )}
                    </ContentCard>
                )}
            </div>
        </AdminLayout>
    );
}
