import { Head, Link, router, usePage } from '@inertiajs/react';
import { Plus, Search, X } from 'lucide-react';
import { useState } from 'react';
import { TicketPriorityBadge } from '@/components/ticket-priority-badge';
import { TicketStatusBadge } from '@/components/ticket-status-badge';
import { Button } from '@/components/ui/button';
import { Card, CardContent } from '@/components/ui/card';
import { Input } from '@/components/ui/input';
import {
    Select,
    SelectContent,
    SelectItem,
    SelectTrigger,
    SelectValue,
} from '@/components/ui/select';
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table';
import { Pagination } from '@/components/ui/pagination';
import AppLayout from '@/layouts/app-layout';
import type {
    BreadcrumbItem,
    CategoryMap,
    PaginatedData,
    PriorityMap,
    StatusMap,
    Ticket,
    User,
} from '@/types';

const breadcrumbs: BreadcrumbItem[] = [
    { title: 'Dashboard', href: '/dashboard' },
    { title: 'Tickets', href: '/tickets' },
];

type Props = {
    tickets: PaginatedData<Ticket>;
    filters: {
        search?: string;
        status?: string;
        priority?: string;
        category?: string;
        filter?: string;
    };
    categories: CategoryMap;
    priorities: PriorityMap;
    statuses: StatusMap;
};

export default function TicketIndex({ tickets, filters, categories, priorities, statuses }: Props) {
    const { auth } = usePage<{ auth: { user: User } }>().props;
    const [search, setSearch] = useState(filters.search || '');

    function applyFilter(key: string, value: string | undefined) {
        const params: Record<string, string> = { ...filters };
        if (value && value !== 'all') {
            params[key] = value;
        } else {
            delete params[key];
        }
        if (search) params.search = search;
        router.get('/tickets', params, { preserveState: true, preserveScroll: true });
    }

    function handleSearch(e: React.FormEvent) {
        e.preventDefault();
        applyFilter('search', search || undefined);
    }

    function clearFilters() {
        setSearch('');
        const params: Record<string, string> = {};
        if (filters.filter) params.filter = filters.filter;
        router.get('/tickets', params, { preserveState: true });
    }

    const hasFilters = filters.search || filters.status || filters.priority || filters.category;

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title="Tickets" />
            <div className="flex h-full flex-1 flex-col gap-6 p-4 md:p-6">
                {/* Header */}
                <div className="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between">
                    <div>
                        <h1 className="text-2xl font-bold tracking-tight">Tickets</h1>
                        <p className="text-sm text-muted-foreground">
                            {tickets.total} total ticket{tickets.total !== 1 ? 's' : ''}
                        </p>
                    </div>
                    {auth.user.role !== 'admin' && (
                        <Link href="/tickets/create">
                            <Button className="gap-2">
                                <Plus className="h-4 w-4" />
                                New Ticket
                            </Button>
                        </Link>
                    )}
                </div>

                {/* Filters */}
                <Card>
                    <CardContent className="p-4">
                        <div className="flex flex-col gap-3 md:flex-row md:items-center">
                            <form onSubmit={handleSearch} className="flex flex-1 gap-2">
                                <div className="relative flex-1">
                                    <Search className="absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
                                    <Input
                                        placeholder="Search by ticket number or title..."
                                        value={search}
                                        onChange={(e) => setSearch(e.target.value)}
                                        className="pl-9"
                                    />
                                </div>
                                <Button type="submit" variant="secondary" size="default">
                                    Search
                                </Button>
                            </form>

                            <div className="flex flex-wrap gap-2">
                                <Select
                                    value={filters.status || 'all'}
                                    onValueChange={(v) => applyFilter('status', v)}
                                >
                                    <SelectTrigger className="w-[140px]">
                                        <SelectValue placeholder="Status" />
                                    </SelectTrigger>
                                    <SelectContent>
                                        <SelectItem value="all">All Status</SelectItem>
                                        {Object.entries(statuses).map(([key, label]) => (
                                            <SelectItem key={key} value={key}>
                                                {label}
                                            </SelectItem>
                                        ))}
                                    </SelectContent>
                                </Select>

                                <Select
                                    value={filters.priority || 'all'}
                                    onValueChange={(v) => applyFilter('priority', v)}
                                >
                                    <SelectTrigger className="w-[140px]">
                                        <SelectValue placeholder="Priority" />
                                    </SelectTrigger>
                                    <SelectContent>
                                        <SelectItem value="all">All Priority</SelectItem>
                                        {Object.entries(priorities).map(([key, label]) => (
                                            <SelectItem key={key} value={key}>
                                                {label}
                                            </SelectItem>
                                        ))}
                                    </SelectContent>
                                </Select>

                                <Select
                                    value={filters.category || 'all'}
                                    onValueChange={(v) => applyFilter('category', v)}
                                >
                                    <SelectTrigger className="w-[160px]">
                                        <SelectValue placeholder="Category" />
                                    </SelectTrigger>
                                    <SelectContent>
                                        <SelectItem value="all">All Categories</SelectItem>
                                        {Object.entries(categories).map(([key, label]) => (
                                            <SelectItem key={key} value={key}>
                                                {label}
                                            </SelectItem>
                                        ))}
                                    </SelectContent>
                                </Select>

                                {hasFilters && (
                                    <Button
                                        variant="ghost"
                                        size="icon"
                                        onClick={clearFilters}
                                        className="shrink-0"
                                    >
                                        <X className="h-4 w-4" />
                                    </Button>
                                )}
                            </div>
                        </div>
                    </CardContent>
                </Card>

                {/* Ticket Table */}
                <Card className="overflow-hidden border-none bg-card/50 shadow-sm ring-1 ring-border/50">
                    <CardContent className="p-0">
                        <Table>
                            <TableHeader>
                                <TableRow>
                                    <TableHead className="w-[200px] lg:w-[300px]">Ticket</TableHead>
                                    <TableHead>Category</TableHead>
                                    <TableHead>Priority</TableHead>
                                    <TableHead>Status</TableHead>
                                    <TableHead>Requester</TableHead>
                                    <TableHead>Division/Dept</TableHead>
                                    <TableHead>Assigned</TableHead>
                                    <TableHead>Date</TableHead>
                                    {auth.user.role !== 'user' && <TableHead className="text-right">Action</TableHead>}
                                </TableRow>
                            </TableHeader>
                            <TableBody>
                                {tickets.data.length === 0 ? (
                                    <TableRow>
                                        <TableCell colSpan={auth.user.role !== 'user' ? 9 : 8} className="h-24 text-center text-muted-foreground">
                                            No tickets found
                                        </TableCell>
                                    </TableRow>
                                ) : (
                                    tickets.data.map((ticket) => (
                                        <TableRow
                                            key={ticket.id}
                                            className="group cursor-pointer hover:bg-muted/50 transition-colors"
                                            onClick={() => router.visit(`/tickets/${ticket.id}`)}
                                        >
                                            <TableCell>
                                                <div className="flex flex-col">
                                                    <span className="text-[10px] font-mono font-medium text-muted-foreground/70">
                                                        #{ticket.ticket_number}
                                                    </span>
                                                    <span className="truncate text-sm font-semibold group-hover:text-primary transition-colors max-w-[200px] lg:max-w-[300px]">
                                                        {ticket.title}
                                                    </span>
                                                </div>
                                            </TableCell>
                                            <TableCell className="text-sm text-foreground/80">
                                                {categories[ticket.category] || ticket.category}
                                            </TableCell>
                                            <TableCell>
                                                <TicketPriorityBadge priority={ticket.priority} />
                                            </TableCell>
                                            <TableCell onClick={(e) => e.stopPropagation()}>
                                                {auth.user.role !== 'user' ? (
                                                    <Select
                                                        value={ticket.status}
                                                        onValueChange={(v) => {
                                                            router.put(`/tickets/${ticket.id}`, { status: v }, { preserveState: true, preserveScroll: true });
                                                        }}
                                                    >
                                                        <SelectTrigger
                                                            className="h-auto w-auto border-none bg-transparent p-0 shadow-none focus:ring-0"
                                                            onClick={(e) => e.stopPropagation()}
                                                        >
                                                            <div className="flex items-center gap-1 hover:opacity-80 transition-opacity">
                                                                <TicketStatusBadge status={ticket.status} />
                                                            </div>
                                                        </SelectTrigger>
                                                        <SelectContent>
                                                            {Object.entries(statuses).map(([key, label]) => (
                                                                <SelectItem key={key} value={key}>
                                                                    {label}
                                                                </SelectItem>
                                                            ))}
                                                        </SelectContent>
                                                    </Select>
                                                ) : (
                                                    <TicketStatusBadge status={ticket.status} />
                                                )}
                                            </TableCell>
                                            <TableCell>
                                                <span className="text-sm font-medium text-foreground">{ticket.requester?.name}</span>
                                            </TableCell>
                                            <TableCell className="text-sm text-foreground/70">
                                                {ticket.requester?.department || <span className="text-muted-foreground/40">—</span>}
                                            </TableCell>
                                            <TableCell className="text-sm text-muted-foreground">
                                                {ticket.assignee?.name || <span className="text-muted-foreground/30">—</span>}
                                            </TableCell>
                                            <TableCell className="text-xs text-muted-foreground whitespace-nowrap">
                                                {new Date(ticket.created_at).toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' })}
                                            </TableCell>
                                            {auth.user.role !== 'user' && (
                                                <TableCell className="text-right" onClick={(e) => e.stopPropagation()}>
                                                    <div className="flex justify-end gap-1">
                                                        {ticket.status === 'resolved' ? (
                                                            <Button
                                                                variant="outline"
                                                                size="sm"
                                                                className="h-7 text-[10px] px-2"
                                                                onClick={() => router.put(`/tickets/${ticket.id}`, { status: 'in_progress' }, { preserveScroll: true })}
                                                            >
                                                                Reopen
                                                            </Button>
                                                        ) : ticket.status !== 'closed' ? (
                                                            <Button
                                                                variant="outline"
                                                                size="sm"
                                                                className="h-7 text-[10px] px-2 text-emerald-600 border-emerald-200 hover:bg-emerald-50 hover:text-emerald-700"
                                                                onClick={() => router.put(`/tickets/${ticket.id}`, { status: 'resolved' }, { preserveScroll: true })}
                                                            >
                                                                Resolve
                                                            </Button>
                                                        ) : (
                                                            <Button
                                                                variant="outline"
                                                                size="sm"
                                                                className="h-7 text-[10px] px-2"
                                                                onClick={() => router.put(`/tickets/${ticket.id}`, { status: 'open' }, { preserveScroll: true })}
                                                            >
                                                                Reopen
                                                            </Button>
                                                        )}
                                                    </div>
                                                </TableCell>
                                            )}
                                        </TableRow>
                                    ))
                                )}
                            </TableBody>
                        </Table>
                        <div className="border-t p-4 flex justify-center">
                            <Pagination links={tickets.links} />
                        </div>
                    </CardContent>
                </Card>
            </div>
        </AppLayout>
    );
}
