import DeviceBatteryIndicator from '@/Components/DeviceBatteryIndicator';
import ShowIf from '@/Components/ShowIf';
import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout';
import { capitalize, t } from '@/lib/utils';
import DeviceDeleteAction from '@/Pages/Device/DeviceDeleteAction';
import { DevicesTable } from '@/Pages/Device/DevicesTable';
import { Device, DevicesResponse, User } from '@/types';
import { Head } from '@inertiajs/react';
import { ColumnDef } from '@tanstack/react-table';
import { TriangleAlert } from 'lucide-react';

interface AdminListProps {
    devices: DevicesResponse;
    availableTypes: string[];
    availableManufacturers: string[];
    canEdit: boolean;
    canCreate: boolean;
    selectedPatient?: User | null;
}

export default function AdminList({
    devices,
    availableTypes,
    availableManufacturers,
    canEdit,
    canCreate,
    selectedPatient,
}: AdminListProps) {
    const tableColumns: ColumnDef<Device>[] = [
        {
            accessorKey: 'model',
            header: capitalize(t('model')),
        },
        {
            accessorKey: 'manufacturer',
            header: capitalize(t('manufacturer')),
        },
        {
            accessorKey: 'type',
            header: capitalize(t('type')),
            cell: ({ row }) => {
                const device = row.original;

                return capitalize(t(device.type));
            },
        },
        {
            accessorKey: 'serial_number',
            header: capitalize(t('serial number')),
        },
        {
            accessorKey: 'battery',
            header: capitalize(t('battery')),
            cell: ({ row }) => <DeviceBatteryIndicator device={row.original} />,
        },
        {
            accessorKey: 'user',
            header: capitalize(t('patient')),
            cell: ({ row }) => {
                const patient = row.original.user;

                if (!patient) {
                    return (
                        <span className="inline-flex items-center gap-1 rounded-full bg-amber-50 px-2 py-0.5 text-xs font-medium text-amber-700">
                            <TriangleAlert className="h-3.5 w-3.5" />
                            {capitalize(t('unassigned'))}
                        </span>
                    );
                }

                return (
                    <span>
                        {patient.name} {patient.surname}
                    </span>
                );
            },
        },
        {
            id: 'actions',
            cell: ({ row }) => {
                const device = row.original;

                return (
                    <ShowIf condition={canEdit}>
                        <DeviceDeleteAction device={device} />
                    </ShowIf>
                );
            },
        },
    ];

    return (
        <AuthenticatedLayout
            backLink={route('dashboard')}
            backLinkLabel="Dashboard"
        >
            <Head title={capitalize(t('devices'))} />

            <div className="py-2">
                <div className="mx-auto max-w-7xl sm:px-6 lg:px-8">
                    <div className="overflow-hidden sm:rounded-lg">
                        <div className="p-6 text-gray-900">
                            <div className="scroll-m-20 text-4xl font-light tracking-tight lg:text-5xl">
                                {capitalize(t('devices'))}
                            </div>
                            <div className="container mx-auto py-10">
                                <DevicesTable
                                    columns={tableColumns}
                                    canEdit={canEdit}
                                    canCreate={canCreate}
                                    data={devices.data}
                                    rowCount={devices.total}
                                    pageSize={devices.per_page}
                                    pageCount={devices.last_page}
                                    availableTypes={availableTypes}
                                    availableManufacturers={
                                        availableManufacturers
                                    }
                                    selectedPatient={selectedPatient}
                                />
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </AuthenticatedLayout>
    );
}
