import FrontendLayout from '@/layouts/frontend/layout';
import { type BreadcrumbItem, type SharedData } from '@/types';
import { Head, usePage } from '@inertiajs/react';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
import { StatsCard, StatsCardGrid } from '@/components/ui/stats-card';
import { Users, Clock, Shield, Coins } from 'lucide-react';

import { ClassIcon, getClassName } from '@/components/game/class-icon';

const breadcrumbs: BreadcrumbItem[] = [
    {
        title: 'Dashboard',
        href: '/dashboard',
    },
];

interface TopupActivity {
    username: string;
    class: number | null;
    gold_amount: number;
    amount: number;
    payment_method: string;
    created_at: string;
}

interface UserCharacter {
    id: number;
    name: string;
    level: number;
    class: number;
    is_online: boolean;
}

interface DashboardProps extends SharedData {
    stats: {
        totalAccounts: number;
        onlinePlayers: number;
        onlineGMs: number;
        serverOnline: boolean;
        serverTime: string;
        serverDate: string;
        timezone: string;
    };
    recentTopups: TopupActivity[];
    userCharacters: UserCharacter[];
    charactersFromCache?: boolean;
}

import { useState, useEffect } from 'react';
import { format, addSeconds, parse } from 'date-fns';

export default function PlayerDashboard({ stats, recentTopups, userCharacters, charactersFromCache: _charactersFromCache = false }: DashboardProps) {
    const { auth } = usePage<SharedData>().props;
    const [currentTime, setCurrentTime] = useState<Date>(() => {
        // Parse initial server time
        // Format of serverDate is "d M Y" and serverTime is "H:i:s"
        const dateTimeString = `${stats.serverDate} ${stats.serverTime}`;
        return parse(dateTimeString, 'dd MMM yyyy HH:mm:ss', new Date());
    });

    useEffect(() => {
        const timer = setInterval(() => {
            setCurrentTime(prev => addSeconds(prev, 1));
        }, 1000);

        return () => clearInterval(timer);
    }, []);

    return (
        <FrontendLayout breadcrumbs={breadcrumbs}>
            <Head title="Dashboard" />

            <div className="space-y-6">
                {/* Welcome Section */}
                <div>
                    <h2 className="text-xl font-bold tracking-tight">
                        Welcome back, {auth.user?.name || 'Player'}!
                    </h2>
                    <p className="text-sm text-muted-foreground">
                        Here's what's happening with your account today.
                    </p>
                </div>

                {/* Stats Cards */}
                <StatsCardGrid columns={4}>
                    <StatsCard
                        title="Registered Accounts"
                        value={stats.totalAccounts}
                        description="Total player accounts"
                        icon={Users}
                        className="bg-blue-500/10 dark:bg-blue-500/15 border border-blue-500/30 dark:border-blue-400/20 shadow-sm"
                        titleClassName="text-blue-700 dark:text-blue-300"
                        valueClassName="text-blue-800 dark:text-blue-100"
                        descriptionClassName="text-blue-600/80 dark:text-blue-400/80"
                        iconClassName="text-blue-500 dark:text-blue-400"
                    />
                    <StatsCard
                        title="Online Players"
                        value={stats.serverOnline ? stats.onlinePlayers : 'Offline'}
                        description={stats.serverOnline ? 'Server Online' : 'Server is offline'}
                        icon={Users}
                        className={stats.serverOnline 
                            ? 'bg-emerald-500/10 dark:bg-emerald-500/15 border border-emerald-500/30 dark:border-emerald-400/20 shadow-sm' 
                            : 'bg-red-500/10 dark:bg-red-500/15 border border-red-500/30 dark:border-red-400/20 shadow-sm'}
                        titleClassName={stats.serverOnline ? 'text-emerald-700 dark:text-emerald-300' : 'text-red-700 dark:text-red-300'}
                        valueClassName={stats.serverOnline ? 'text-emerald-800 dark:text-emerald-100' : 'text-red-800 dark:text-red-100'}
                        descriptionClassName={stats.serverOnline ? 'text-emerald-600/80 dark:text-emerald-400/80' : 'text-red-600/80 dark:text-red-400/80'}
                        iconClassName={stats.serverOnline ? 'text-emerald-500 dark:text-emerald-400' : 'text-red-500 dark:text-red-400'}
                    />
                    <StatsCard
                        title="Online GMs"
                        value={stats.onlineGMs}
                        description="Support staff online"
                        icon={Shield}
                        className="bg-violet-500/10 dark:bg-violet-500/15 border border-violet-500/30 dark:border-violet-400/20 shadow-sm"
                        titleClassName="text-violet-700 dark:text-violet-300"
                        valueClassName="text-violet-800 dark:text-violet-100"
                        descriptionClassName="text-violet-600/80 dark:text-violet-400/80"
                        iconClassName="text-violet-500 dark:text-violet-400"
                    />
                    <StatsCard
                        title="Server Time"
                        value={format(currentTime, 'HH:mm:ss')}
                        description={format(currentTime, 'dd MMM yyyy')}
                        icon={Clock}
                        className="bg-orange-500/10 dark:bg-orange-500/15 border border-orange-500/30 dark:border-orange-400/20 shadow-sm"
                        titleClassName="text-orange-700 dark:text-orange-300"
                        valueClassName="text-orange-800 dark:text-orange-100"
                        descriptionClassName="text-orange-600/80 dark:text-orange-400/80"
                        iconClassName="text-orange-500 dark:text-orange-400"
                    />
                </StatsCardGrid>

                {/* Two Column Layout */}
                <div className="grid gap-6 grid-cols-1 lg:grid-cols-2">
                    {/* Recent Activity */}
                    <Card className="h-[570px] flex flex-col">
                        <CardHeader>
                            <CardTitle>Recent Top Up Activity</CardTitle>
                            <CardDescription>
                                Latest players who Top Up their accounts
                            </CardDescription>
                        </CardHeader>
                        <CardContent className="flex-1 overflow-y-auto">
                            {recentTopups && recentTopups.length > 0 ? (
                                <div className="space-y-4">
                                    {recentTopups.map((topup, index) => (
                                        <div key={index} className="flex items-center gap-4 border-b pb-4 last:border-0 last:pb-0">
                                            {topup.class !== null ? (
                                                <ClassIcon classId={topup.class} size="md" />
                                            ) : (
                                                <div className="flex h-10 w-10 items-center justify-center rounded-full bg-green-500/10 dark:bg-green-500/20">
                                                    <Coins className="h-5 w-5 text-green-600 dark:text-green-400" />
                                                </div>
                                            )}
                                            <div className="flex-1 space-y-1">
                                                <p className="text-sm font-medium leading-none">
                                                    {topup.username}
                                                </p>
                                                <p className="text-sm text-muted-foreground">
                                                    Top up {topup.gold_amount.toLocaleString()} gold via {topup.payment_method}
                                                </p>
                                            </div>
                                            <div className="text-sm text-muted-foreground">
                                                {topup.created_at}
                                            </div>
                                        </div>
                                    ))}
                                </div>
                            ) : (
                                <div className="flex items-center justify-center h-full text-sm text-muted-foreground">
                                    No recent top-up activity
                                </div>
                            )}
                        </CardContent>
                    </Card>

                    {/* User Characters */}
                    <Card className="h-[570px] flex flex-col">
                        <CardHeader>
                            <CardTitle>Your Characters</CardTitle>
                        </CardHeader>
                        <CardContent className="flex-1 overflow-y-auto">
                            {userCharacters && userCharacters.length > 0 ? (
                                <div className="space-y-3">
                                    {userCharacters.map((character, index) => (
                                        <div key={index} className="flex items-center gap-4 border-b pb-3 last:border-0 last:pb-0">
                                            <div className="relative">
                                                <ClassIcon classId={character.class} size="lg" />
                                                {character.is_online && (
                                                    <div className="absolute -bottom-1 -right-1 h-3 w-3 rounded-full bg-green-500 border-2 border-background"></div>
                                                )}
                                            </div>
                                            <div className="flex-1 space-y-1">
                                                <div className="flex items-center gap-2">
                                                    <p className="text-sm font-medium leading-none">
                                                        {character.name}
                                                    </p>
                                                    {character.is_online && (
                                                        <span className="inline-flex items-center rounded-full bg-green-500/10 dark:bg-green-500/20 px-2 py-0.5 text-xs font-medium text-green-700 dark:text-green-400">
                                                            Online
                                                        </span>
                                                    )}
                                                </div>
                                                <p className="text-sm text-muted-foreground">
                                                    Level {character.level} • {getClassName(character.class)}
                                                </p>
                                            </div>
                                        </div>
                                    ))}
                                </div>
                            ) : (
                                <div className="flex items-center justify-center h-full text-sm text-muted-foreground">
                                    No characters found
                                </div>
                            )}
                        </CardContent>
                    </Card>
                </div>
            </div>
        </FrontendLayout>
    );
}
