import { Head, Link, router } from '@inertiajs/react';
import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import {
    Select,
    SelectContent,
    SelectItem,
    SelectTrigger,
    SelectValue,
} from '@/components/ui/select';
import type { Company, PaginatedData, System, Ticket } from '@/types';
import { useState } from 'react';

const statusColors: Record<string, string> = {
    open: 'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-300',
    in_progress:
        'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300',
    pending:
        'bg-orange-100 text-orange-800 dark:bg-orange-900 dark:text-orange-300',
    resolved:
        'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-300',
    closed: 'bg-gray-100 text-gray-800 dark:bg-gray-900 dark:text-gray-300',
};

const priorityColors: Record<string, string> = {
    low: 'bg-slate-100 text-slate-800 dark:bg-slate-900 dark:text-slate-300',
    medium: 'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-300',
    high: 'bg-orange-100 text-orange-800 dark:bg-orange-900 dark:text-orange-300',
    critical: 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-300',
};

type Props = {
    tickets: PaginatedData<Ticket>;
    companies: Company[];
    systems: System[];
    filters: {
        company_id?: string;
        system_id?: string;
        status?: string;
        priority?: string;
        search?: string;
    };
};

export default function TicketsIndex({
    tickets,
    companies,
    systems,
    filters,
}: Props) {
    const [search, setSearch] = useState(filters.search ?? '');

    function applyFilter(key: string, value: string | undefined) {
        const resolved = value === '__all__' ? undefined : value || undefined;
        router.get(
            '/tickets',
            { ...filters, [key]: resolved },
            { preserveState: true, replace: true },
        );
    }

    function handleSearch(e: React.FormEvent) {
        e.preventDefault();
        applyFilter('search', search);
    }

    return (
        <>
            <Head title="Tickets" />
            <div className="space-y-4 p-4">
                <div className="flex items-center justify-between">
                    <h1 className="text-2xl font-bold">Tickets</h1>
                    <Button asChild>
                        <Link href="/tickets/create">Create Ticket</Link>
                    </Button>
                </div>

                {/* Filters */}
                <div className="flex flex-wrap gap-3">
                    <form onSubmit={handleSearch} className="flex gap-2">
                        <Input
                            placeholder="Search tickets..."
                            value={search}
                            onChange={(e) => setSearch(e.target.value)}
                            className="w-64"
                        />
                        <Button type="submit" variant="secondary" size="sm">
                            Search
                        </Button>
                    </form>

                    <Select
                        value={filters.company_id ?? '__all__'}
                        onValueChange={(v) => applyFilter('company_id', v)}
                    >
                        <SelectTrigger className="w-40">
                            <SelectValue placeholder="All Companies" />
                        </SelectTrigger>
                        <SelectContent>
                            <SelectItem value="__all__">
                                All Companies
                            </SelectItem>
                            {companies.map((c) => (
                                <SelectItem key={c.id} value={String(c.id)}>
                                    {c.name}
                                </SelectItem>
                            ))}
                        </SelectContent>
                    </Select>

                    <Select
                        value={filters.system_id ?? '__all__'}
                        onValueChange={(v) => applyFilter('system_id', v)}
                    >
                        <SelectTrigger className="w-40">
                            <SelectValue placeholder="All Systems" />
                        </SelectTrigger>
                        <SelectContent>
                            <SelectItem value="__all__">All Systems</SelectItem>
                            {systems.map((s) => (
                                <SelectItem key={s.id} value={String(s.id)}>
                                    {s.name}
                                </SelectItem>
                            ))}
                        </SelectContent>
                    </Select>

                    <Select
                        value={filters.status ?? '__all__'}
                        onValueChange={(v) => applyFilter('status', v)}
                    >
                        <SelectTrigger className="w-40">
                            <SelectValue placeholder="All Statuses" />
                        </SelectTrigger>
                        <SelectContent>
                            <SelectItem value="__all__">
                                All Statuses
                            </SelectItem>
                            <SelectItem value="open">Open</SelectItem>
                            <SelectItem value="in_progress">
                                In Progress
                            </SelectItem>
                            <SelectItem value="pending">Pending</SelectItem>
                            <SelectItem value="resolved">Resolved</SelectItem>
                            <SelectItem value="closed">Closed</SelectItem>
                        </SelectContent>
                    </Select>

                    <Select
                        value={filters.priority ?? '__all__'}
                        onValueChange={(v) => applyFilter('priority', v)}
                    >
                        <SelectTrigger className="w-40">
                            <SelectValue placeholder="All Priorities" />
                        </SelectTrigger>
                        <SelectContent>
                            <SelectItem value="__all__">
                                All Priorities
                            </SelectItem>
                            <SelectItem value="low">Low</SelectItem>
                            <SelectItem value="medium">Medium</SelectItem>
                            <SelectItem value="high">High</SelectItem>
                            <SelectItem value="critical">Critical</SelectItem>
                        </SelectContent>
                    </Select>
                </div>

                {/* Ticket Table */}
                <div className="overflow-hidden rounded-lg border">
                    <table className="w-full text-sm">
                        <thead className="bg-muted/50">
                            <tr>
                                <th className="p-3 text-left font-medium">
                                    Ticket #
                                </th>
                                <th className="p-3 text-left font-medium">
                                    Title
                                </th>
                                <th className="p-3 text-left font-medium">
                                    Company
                                </th>
                                <th className="p-3 text-left font-medium">
                                    System
                                </th>
                                <th className="p-3 text-left font-medium">
                                    Priority
                                </th>
                                <th className="p-3 text-left font-medium">
                                    Status
                                </th>
                                <th className="p-3 text-left font-medium">
                                    Assigned To
                                </th>
                                <th className="p-3 text-left font-medium">
                                    Created
                                </th>
                            </tr>
                        </thead>
                        <tbody>
                            {tickets.data.map((ticket) => (
                                <tr
                                    key={ticket.id}
                                    className="cursor-pointer border-t hover:bg-muted/30"
                                    onClick={() =>
                                        router.visit(`/tickets/${ticket.id}`)
                                    }
                                >
                                    <td className="p-3 font-mono text-xs">
                                        {ticket.ticket_no}
                                    </td>
                                    <td className="max-w-xs truncate p-3">
                                        {ticket.title}
                                    </td>
                                    <td className="p-3">
                                        {ticket.company?.name}
                                    </td>
                                    <td className="p-3">
                                        {ticket.system?.name}
                                    </td>
                                    <td className="p-3">
                                        <span
                                            className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${priorityColors[ticket.priority]}`}
                                        >
                                            {ticket.priority}
                                        </span>
                                    </td>
                                    <td className="p-3">
                                        <span
                                            className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${statusColors[ticket.status]}`}
                                        >
                                            {ticket.status.replace('_', ' ')}
                                        </span>
                                    </td>
                                    <td className="p-3">
                                        {ticket.assignee?.name ?? '—'}
                                    </td>
                                    <td className="p-3 text-xs text-muted-foreground">
                                        {new Date(
                                            ticket.created_at,
                                        ).toLocaleDateString()}
                                    </td>
                                </tr>
                            ))}
                            {tickets.data.length === 0 && (
                                <tr>
                                    <td
                                        colSpan={8}
                                        className="p-8 text-center text-muted-foreground"
                                    >
                                        No tickets found.
                                    </td>
                                </tr>
                            )}
                        </tbody>
                    </table>
                </div>

                {/* Pagination */}
                {tickets.last_page > 1 && (
                    <div className="flex items-center justify-between">
                        <p className="text-sm text-muted-foreground">
                            Showing {tickets.from} to {tickets.to} of{' '}
                            {tickets.total} tickets
                        </p>
                        <div className="flex gap-1">
                            {tickets.prev_page_url && (
                                <Button variant="outline" size="sm" asChild>
                                    <Link href={tickets.prev_page_url}>
                                        Previous
                                    </Link>
                                </Button>
                            )}
                            {tickets.next_page_url && (
                                <Button variant="outline" size="sm" asChild>
                                    <Link href={tickets.next_page_url}>
                                        Next
                                    </Link>
                                </Button>
                            )}
                        </div>
                    </div>
                )}
            </div>
        </>
    );
}
