import { Column } from '@tanstack/react-table';
import { ArrowDown, ArrowUp, ChevronsUpDown } from 'lucide-react';

import { Button } from '@/components/ui/button';
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu';
import { cn } from '@/lib/utils';
import { QueryParams } from '@/types';
import { router } from '@inertiajs/react';

interface DataTableColumnHeaderProps<TData, TValue> extends React.HTMLAttributes<HTMLDivElement> {
    column: Column<TData, TValue>;
    title: string;
    queryParams: QueryParams;
    navigate?: (params: Record<string, any>) => void;
}

export function DataTableColumnHeader<TData, TValue>({ column, title, className, queryParams, navigate }: DataTableColumnHeaderProps<TData, TValue>) {
    if (!column.getCanSort()) {
        return <div className={cn(className)}>{title}</div>;
    }

    const handleSort = (direction: 'asc' | 'desc') => {
        const next = { ...queryParams, sort_by: column.id, sort_dir: direction };
        if (navigate) {
            navigate(next);
        } else {
            router.get(route(route().current() ?? ''), next, { preserveScroll: true, preserveState: true });
        }
    };

    return (
        <div className={cn('flex items-center gap-2', className)}>
            <DropdownMenu>
                <DropdownMenuTrigger asChild>
                    <Button variant="ghost" size="sm" className="-ml-3 h-8 data-[state=open]:bg-accent">
                        <span>{title}</span>
                        {queryParams?.sort_dir === 'desc' && queryParams?.sort_by === column.id ? (
                            <ArrowDown />
                        ) : queryParams?.sort_dir === 'asc' && queryParams?.sort_by === column.id ? (
                            <ArrowUp />
                        ) : (
                            <ChevronsUpDown />
                        )}
                    </Button>
                </DropdownMenuTrigger>
                <DropdownMenuContent align="start">
                    <DropdownMenuItem onClick={() => handleSort('asc')}>
                        <ArrowUp />
                        Asc
                    </DropdownMenuItem>
                    <DropdownMenuItem onClick={() => handleSort('desc')}>
                        <ArrowDown />
                        Desc
                    </DropdownMenuItem>
                </DropdownMenuContent>
            </DropdownMenu>
        </div>
    );
}
