import { Head } from '@inertiajs/react';
import UserAuditController from '@/actions/App/Http/Controllers/Admin/UserAuditController';
import Heading from '@/components/heading';
import { Badge } from '@/components/ui/badge';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';

type AuditUser = {
    id: number;
    name: string;
    email: string;
};

type AuditRecord = {
    id: number;
    type: string;
    event: string;
    description: string | null;
    route_name: string | null;
    method: string | null;
    url: string | null;
    status_code: number | null;
    ip_address: string | null;
    user_agent: string | null;
    context: Record<string, unknown> | null;
    created_at: string;
    user: AuditUser | null;
};

type TopUser = AuditUser & {
    audits_count: number;
};

type Stats = {
    activity_count: number;
    error_count: number;
    active_users_count: number;
};

function formatDate(value: string): string {
    return new Intl.DateTimeFormat('en-GB', {
        day: 'numeric',
        month: 'short',
        year: 'numeric',
        hour: '2-digit',
        minute: '2-digit',
    }).format(new Date(value));
}

function statusBadge(statusCode: number | null): string {
    if (statusCode === null) {
        return 'bg-muted text-muted-foreground';
    }

    if (statusCode >= 500) {
        return 'bg-red-600/10 text-red-700 hover:bg-red-600/10 dark:text-red-300';
    }

    if (statusCode >= 400) {
        return 'bg-amber-500/10 text-amber-700 hover:bg-amber-500/10 dark:text-amber-300';
    }

    return 'bg-emerald-600/10 text-emerald-700 hover:bg-emerald-600/10 dark:text-emerald-300';
}

export default function AdminAuditIndex({
    stats,
    recentActivity,
    recentErrors,
    topUsers,
}: {
    stats: Stats;
    recentActivity: AuditRecord[];
    recentErrors: AuditRecord[];
    topUsers: TopUser[];
}) {
    return (
        <>
            <Head title="User audit" />

            <div className="space-y-6 p-4 md:p-6">
                <Heading
                    title="User audit"
                    description="Review what members have been doing across the site and inspect the latest recorded application errors."
                />

                <div className="grid gap-4 sm:grid-cols-3">
                    <Card className="border-border/70">
                        <CardHeader>
                            <CardDescription>Total activity</CardDescription>
                            <CardTitle className="text-3xl">{stats.activity_count}</CardTitle>
                        </CardHeader>
                    </Card>
                    <Card className="border-border/70">
                        <CardHeader>
                            <CardDescription>Total errors</CardDescription>
                            <CardTitle className="text-3xl">{stats.error_count}</CardTitle>
                        </CardHeader>
                    </Card>
                    <Card className="border-border/70">
                        <CardHeader>
                            <CardDescription>Users tracked</CardDescription>
                            <CardTitle className="text-3xl">{stats.active_users_count}</CardTitle>
                        </CardHeader>
                    </Card>
                </div>

                <div className="grid gap-6 xl:grid-cols-[0.7fr_1.3fr]">
                    <Card className="border-border/70">
                        <CardHeader>
                            <CardTitle>Most active users</CardTitle>
                            <CardDescription>
                                Members with the largest recorded audit trail so far.
                            </CardDescription>
                        </CardHeader>
                        <CardContent className="space-y-3">
                            {topUsers.length > 0 ? (
                                topUsers.map((user) => (
                                    <div
                                        key={user.id}
                                        className="flex items-center justify-between rounded-2xl border border-border/70 bg-muted/15 p-4"
                                    >
                                        <div>
                                            <p className="font-medium">{user.name}</p>
                                            <p className="text-sm text-muted-foreground">{user.email}</p>
                                        </div>
                                        <Badge variant="secondary">{user.audits_count} events</Badge>
                                    </div>
                                ))
                            ) : (
                                <p className="text-sm text-muted-foreground">
                                    Audit data will appear here once members start using the site.
                                </p>
                            )}
                        </CardContent>
                    </Card>

                    <div className="space-y-6">
                        <Card className="border-border/70">
                            <CardHeader>
                                <CardTitle>Recent user activity</CardTitle>
                                <CardDescription>
                                    Recorded requests from authenticated users across scoring, admin, and dashboard pages.
                                </CardDescription>
                            </CardHeader>
                            <CardContent className="space-y-4">
                                {recentActivity.length > 0 ? (
                                    recentActivity.map((record) => (
                                        <div
                                            key={record.id}
                                            className="rounded-2xl border border-border/70 bg-muted/15 p-4"
                                        >
                                            <div className="flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between">
                                                <div>
                                                    <p className="font-medium">
                                                        {record.user?.name ?? 'Unknown user'}
                                                    </p>
                                                    <p className="text-sm text-muted-foreground">
                                                        {record.user?.email ?? 'No email available'}
                                                    </p>
                                                </div>
                                                <div className="flex flex-wrap gap-2">
                                                    <Badge variant="secondary">
                                                        {record.method ?? 'N/A'}
                                                    </Badge>
                                                    <Badge className={statusBadge(record.status_code)}>
                                                        {record.status_code ?? 'No status'}
                                                    </Badge>
                                                </div>
                                            </div>
                                            <p className="mt-3 text-sm font-medium text-foreground">
                                                {record.description ?? record.event}
                                            </p>
                                            <div className="mt-2 space-y-1 text-sm text-muted-foreground">
                                                <p>{record.route_name ?? record.url ?? 'No route recorded'}</p>
                                                <p>{formatDate(record.created_at)}</p>
                                            </div>
                                        </div>
                                    ))
                                ) : (
                                    <p className="text-sm text-muted-foreground">
                                        No activity has been recorded yet.
                                    </p>
                                )}
                            </CardContent>
                        </Card>

                        <Card className="border-border/70">
                            <CardHeader>
                                <CardTitle>Recent errors</CardTitle>
                                <CardDescription>
                                    Errors captured while authenticated users were using the site.
                                </CardDescription>
                            </CardHeader>
                            <CardContent className="space-y-4">
                                {recentErrors.length > 0 ? (
                                    recentErrors.map((record) => (
                                        <div
                                            key={record.id}
                                            className="rounded-2xl border border-border/70 bg-red-500/5 p-4"
                                        >
                                            <div className="flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between">
                                                <div>
                                                    <p className="font-medium">
                                                        {record.user?.name ?? 'Unknown user'}
                                                    </p>
                                                    <p className="text-sm text-muted-foreground">
                                                        {record.user?.email ?? 'No email available'}
                                                    </p>
                                                </div>
                                                <Badge className={statusBadge(record.status_code)}>
                                                    {record.status_code ?? 'Error'}
                                                </Badge>
                                            </div>
                                            <p className="mt-3 text-sm font-medium text-foreground">
                                                {record.description ?? record.event}
                                            </p>
                                            <div className="mt-2 space-y-1 text-sm text-muted-foreground">
                                                <p>{record.event}</p>
                                                <p>{record.route_name ?? record.url ?? 'No route recorded'}</p>
                                                <p>{formatDate(record.created_at)}</p>
                                            </div>
                                        </div>
                                    ))
                                ) : (
                                    <p className="text-sm text-muted-foreground">
                                        No authenticated user errors have been recorded yet.
                                    </p>
                                )}
                            </CardContent>
                        </Card>
                    </div>
                </div>
            </div>
        </>
    );
}

AdminAuditIndex.layout = {
    breadcrumbs: [
        {
            title: 'Dashboard',
            href: '/dashboard',
        },
        {
            title: 'Audit',
            href: UserAuditController.index(),
        },
    ],
};
