import { Head, Link } from '@inertiajs/react';
import { Badge } from '@/components/ui/badge';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { dashboard } from '@/routes';
import type { DashboardStats, SlaPerformance, Ticket } from '@/types';

type Props = {
    stats: DashboardStats;
    ticketsByStatus: Record<string, number>;
    ticketsByPriority: Record<string, number>;
    ticketsByCompany: Record<string, number>;
    ticketsBySystem: Record<string, number>;
    recentTickets: Ticket[];
    slaPerformance: SlaPerformance;
};

const priorityColor: Record<string, string> = {
    low: 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200',
    medium: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200',
    high: 'bg-orange-100 text-orange-800 dark:bg-orange-900 dark:text-orange-200',
    critical: 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200',
};

const statusColor: Record<string, string> = {
    open: 'default',
    in_progress: 'secondary',
    pending: 'outline',
    resolved: 'default',
    closed: 'secondary',
};

export default function Dashboard({
    stats,
    ticketsByStatus,
    ticketsByPriority,
    ticketsByCompany,
    ticketsBySystem,
    recentTickets,
    slaPerformance,
}: Props) {
    const slaRate =
        slaPerformance.total > 0
            ? Math.round((slaPerformance.met / slaPerformance.total) * 100)
            : 0;

    return (
        <>
            <Head title="Dashboard" />
            <div className="flex h-full flex-1 flex-col gap-4 overflow-x-auto rounded-xl p-4">
                {/* Stat Cards */}
                <div className="grid gap-4 md:grid-cols-5">
                    <Card>
                        <CardHeader className="pb-2">
                            <CardTitle className="text-sm text-muted-foreground">
                                Total Tickets
                            </CardTitle>
                        </CardHeader>
                        <CardContent>
                            <p className="text-3xl font-bold">
                                {stats.totalTickets}
                            </p>
                        </CardContent>
                    </Card>
                    <Card>
                        <CardHeader className="pb-2">
                            <CardTitle className="text-sm text-muted-foreground">
                                Open
                            </CardTitle>
                        </CardHeader>
                        <CardContent>
                            <p className="text-3xl font-bold text-blue-600">
                                {stats.openTickets}
                            </p>
                        </CardContent>
                    </Card>
                    <Card>
                        <CardHeader className="pb-2">
                            <CardTitle className="text-sm text-muted-foreground">
                                In Progress
                            </CardTitle>
                        </CardHeader>
                        <CardContent>
                            <p className="text-3xl font-bold text-yellow-600">
                                {stats.inProgressTickets}
                            </p>
                        </CardContent>
                    </Card>
                    <Card>
                        <CardHeader className="pb-2">
                            <CardTitle className="text-sm text-muted-foreground">
                                Resolved
                            </CardTitle>
                        </CardHeader>
                        <CardContent>
                            <p className="text-3xl font-bold text-green-600">
                                {stats.resolvedTickets}
                            </p>
                        </CardContent>
                    </Card>
                    <Card>
                        <CardHeader className="pb-2">
                            <CardTitle className="text-sm text-muted-foreground">
                                Overdue
                            </CardTitle>
                        </CardHeader>
                        <CardContent>
                            <p className="text-3xl font-bold text-red-600">
                                {stats.overdueTickets}
                            </p>
                        </CardContent>
                    </Card>
                </div>

                <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
                    {/* By Status */}
                    <Card>
                        <CardHeader>
                            <CardTitle>By Status</CardTitle>
                        </CardHeader>
                        <CardContent className="space-y-2">
                            {Object.entries(ticketsByStatus).map(
                                ([status, count]) => (
                                    <div
                                        key={status}
                                        className="flex items-center justify-between"
                                    >
                                        <Badge
                                            variant={
                                                (statusColor[status] as any) ??
                                                'outline'
                                            }
                                        >
                                            {status.replace('_', ' ')}
                                        </Badge>
                                        <span className="font-semibold">
                                            {count}
                                        </span>
                                    </div>
                                ),
                            )}
                            {Object.keys(ticketsByStatus).length === 0 && (
                                <p className="text-sm text-muted-foreground">
                                    No data
                                </p>
                            )}
                        </CardContent>
                    </Card>

                    {/* By Priority */}
                    <Card>
                        <CardHeader>
                            <CardTitle>By Priority</CardTitle>
                        </CardHeader>
                        <CardContent className="space-y-2">
                            {Object.entries(ticketsByPriority).map(
                                ([priority, count]) => (
                                    <div
                                        key={priority}
                                        className="flex items-center justify-between"
                                    >
                                        <span
                                            className={`rounded px-2 py-0.5 text-xs font-medium ${priorityColor[priority] ?? ''}`}
                                        >
                                            {priority}
                                        </span>
                                        <span className="font-semibold">
                                            {count}
                                        </span>
                                    </div>
                                ),
                            )}
                            {Object.keys(ticketsByPriority).length === 0 && (
                                <p className="text-sm text-muted-foreground">
                                    No data
                                </p>
                            )}
                        </CardContent>
                    </Card>

                    {/* SLA Performance */}
                    <Card>
                        <CardHeader>
                            <CardTitle>SLA Performance</CardTitle>
                        </CardHeader>
                        <CardContent className="space-y-3">
                            <p className="text-4xl font-bold">{slaRate}%</p>
                            <p className="text-sm text-muted-foreground">
                                compliance rate
                            </p>
                            <div className="space-y-1 text-sm">
                                <div className="flex justify-between">
                                    <span>Met</span>
                                    <span className="font-medium text-green-600">
                                        {slaPerformance.met}
                                    </span>
                                </div>
                                <div className="flex justify-between">
                                    <span>Breached</span>
                                    <span className="font-medium text-red-600">
                                        {slaPerformance.breached}
                                    </span>
                                </div>
                                <div className="flex justify-between">
                                    <span>Total tracked</span>
                                    <span className="font-medium">
                                        {slaPerformance.total}
                                    </span>
                                </div>
                            </div>
                        </CardContent>
                    </Card>
                </div>

                <div className="grid gap-4 md:grid-cols-2">
                    {/* By Company */}
                    <Card>
                        <CardHeader>
                            <CardTitle>By Company</CardTitle>
                        </CardHeader>
                        <CardContent>
                            {Object.entries(ticketsByCompany).length > 0 ? (
                                <div className="space-y-2">
                                    {Object.entries(ticketsByCompany).map(
                                        ([name, count]) => (
                                            <div
                                                key={name}
                                                className="flex items-center justify-between"
                                            >
                                                <span className="mr-2 truncate text-sm">
                                                    {name}
                                                </span>
                                                <span className="text-sm font-semibold">
                                                    {count}
                                                </span>
                                            </div>
                                        ),
                                    )}
                                </div>
                            ) : (
                                <p className="text-sm text-muted-foreground">
                                    No data
                                </p>
                            )}
                        </CardContent>
                    </Card>

                    {/* By System */}
                    <Card>
                        <CardHeader>
                            <CardTitle>By System</CardTitle>
                        </CardHeader>
                        <CardContent>
                            {Object.entries(ticketsBySystem).length > 0 ? (
                                <div className="space-y-2">
                                    {Object.entries(ticketsBySystem).map(
                                        ([name, count]) => (
                                            <div
                                                key={name}
                                                className="flex items-center justify-between"
                                            >
                                                <span className="mr-2 truncate text-sm">
                                                    {name}
                                                </span>
                                                <span className="text-sm font-semibold">
                                                    {count}
                                                </span>
                                            </div>
                                        ),
                                    )}
                                </div>
                            ) : (
                                <p className="text-sm text-muted-foreground">
                                    No data
                                </p>
                            )}
                        </CardContent>
                    </Card>
                </div>

                {/* Recent Tickets */}
                <Card>
                    <CardHeader>
                        <CardTitle>Recent Tickets</CardTitle>
                    </CardHeader>
                    <CardContent>
                        <div className="overflow-x-auto">
                            <table className="w-full text-sm">
                                <thead className="text-left text-muted-foreground">
                                    <tr>
                                        <th className="pb-2">Ticket #</th>
                                        <th className="pb-2">Title</th>
                                        <th className="pb-2">Priority</th>
                                        <th className="pb-2">Status</th>
                                        <th className="pb-2">Assignee</th>
                                        <th className="pb-2">Date</th>
                                    </tr>
                                </thead>
                                <tbody>
                                    {recentTickets.map((ticket) => (
                                        <tr
                                            key={ticket.id}
                                            className="border-t"
                                        >
                                            <td className="py-2">
                                                <Link
                                                    href={`/tickets/${ticket.id}`}
                                                    className="text-primary hover:underline"
                                                >
                                                    {ticket.ticket_no}
                                                </Link>
                                            </td>
                                            <td className="max-w-xs truncate py-2">
                                                {ticket.title}
                                            </td>
                                            <td className="py-2">
                                                <span
                                                    className={`rounded px-2 py-0.5 text-xs font-medium ${priorityColor[ticket.priority] ?? ''}`}
                                                >
                                                    {ticket.priority}
                                                </span>
                                            </td>
                                            <td className="py-2">
                                                <Badge
                                                    variant={
                                                        (statusColor[
                                                            ticket.status
                                                        ] as any) ?? 'outline'
                                                    }
                                                >
                                                    {ticket.status.replace(
                                                        '_',
                                                        ' ',
                                                    )}
                                                </Badge>
                                            </td>
                                            <td className="py-2">
                                                {ticket.assignee?.name ?? '—'}
                                            </td>
                                            <td className="py-2 text-muted-foreground">
                                                {new Date(
                                                    ticket.created_at,
                                                ).toLocaleDateString()}
                                            </td>
                                        </tr>
                                    ))}
                                    {recentTickets.length === 0 && (
                                        <tr>
                                            <td
                                                colSpan={6}
                                                className="py-6 text-center text-muted-foreground"
                                            >
                                                No tickets yet.
                                            </td>
                                        </tr>
                                    )}
                                </tbody>
                            </table>
                        </div>
                    </CardContent>
                </Card>
            </div>
        </>
    );
}

Dashboard.layout = {
    breadcrumbs: [
        {
            title: 'Dashboard',
            href: dashboard(),
        },
    ],
};
