import { Head, router } from '@inertiajs/react'
import { useState } from 'react'
import { toast } from 'sonner'
import { LimsAppLayout } from '@/layouts/lims-app-layout'
import { Badge } from '@ui/components/ui/badge'
import { Button } from '@ui/components/ui/button'
import { Pencil, Plus } from 'lucide-react'
import { ResizableDrawer } from '@/components/common/ResizableDrawer'
import { DeleteConfirmationDialog } from '@/components/common/DeleteConfirmationDialog'
import { TestConfigurationTabs } from '@/components/master-data/TestConfigurationTabs'
import { type TestTemplate } from '@/types/glims'
import { TestTemplateParamForm } from './components/TestTemplateParamForm'

interface OptionSimple {
    id: number
    code: string
    name: string
}

interface Props {
    testTemplate: TestTemplate
    parameterOptions: OptionSimple[]
    methodOptions: OptionSimple[]
}

export default function TestTemplateParameters({
    testTemplate,
    parameterOptions,
    methodOptions,
}: Props) {
    const params = (testTemplate.params ?? []).slice().sort((a, b) => (a.sort_order ?? 0) - (b.sort_order ?? 0))

    const [isDrawerOpen, setIsDrawerOpen] = useState(false)
    const [selectedParam, setSelectedParam] = useState<NonNullable<TestTemplate['params']>[number] | undefined>()
    const [isDeleteOpen, setIsDeleteOpen] = useState(false)
    const [paramToDelete, setParamToDelete] = useState<NonNullable<TestTemplate['params']>[number] | undefined>()
    const [isDeleting, setIsDeleting] = useState(false)

    const base = `/master-data/test-templates/${testTemplate.id}/parameters`

    function handleCreate() {
        setSelectedParam(undefined)
        setIsDrawerOpen(true)
    }

    function handleEdit(param: NonNullable<TestTemplate['params']>[number]) {
        setSelectedParam(param)
        setIsDrawerOpen(true)
    }

    function handleDeleteClick(param: NonNullable<TestTemplate['params']>[number]) {
        setParamToDelete(param)
        setIsDeleteOpen(true)
    }

    function handleDeleteConfirm() {
        if (!paramToDelete) return

        const name = paramToDelete.parameter?.name ?? `#${paramToDelete.id}`
        router.delete(`${base}/${paramToDelete.id}`, {
            onStart: () => setIsDeleting(true),
            onSuccess: () => {
                toast.success(`Parameter "${name}" berhasil dihapus.`)
                setIsDeleteOpen(false)
                setParamToDelete(undefined)
            },
            onError: () => toast.error('Terjadi kesalahan. Silakan coba lagi.'),
            onFinish: () => setIsDeleting(false),
        })
    }

    return (
        <LimsAppLayout>
            <Head title={`Konfigurasi Uji - Kelola Parameter ${testTemplate.code}`} />
            <div className='flex h-full flex-1 flex-col gap-4 p-4'>
                <div className='flex flex-wrap items-center justify-between gap-3'>
                    <div>
                        <h1 className='text-xl font-bold tracking-tight'>Konfigurasi Uji</h1>
                        <p className='text-sm text-muted-foreground'>
                            Kelola parameter untuk {testTemplate.code} - {testTemplate.sample_type?.name ?? '-'} - {testTemplate.regulation?.short_name ?? testTemplate.regulation?.name ?? 'Tanpa regulasi'}
                        </p>
                    </div>
                    <div className='flex gap-2'>
                        <Button className='gap-2' onClick={handleCreate}>
                            <Plus className='h-4 w-4' /> Tambah Parameter
                        </Button>
                        <Button variant='outline' onClick={() => router.get('/master-data/test-templates')}>
                            Kembali ke Template Uji
                        </Button>
                    </div>
                </div>

                <TestConfigurationTabs />

                <div className='rounded-xl border bg-card p-4'>
                    <div className='mb-3 flex items-center justify-between'>
                        <h2 className='font-semibold'>Daftar Parameter</h2>
                        <Badge variant='secondary'>Total: {params.length}</Badge>
                    </div>

                    {params.length === 0 ? (
                        <div className='rounded-lg border border-dashed p-8 text-center text-sm text-muted-foreground'>
                            Belum ada parameter pada template ini.
                        </div>
                    ) : (
                        <div className='space-y-2'>
                            {params.map((item, index) => (
                                <div key={item.id} className='grid grid-cols-1 gap-3 rounded-lg border bg-background p-3 md:grid-cols-8'>
                                    <div className='text-sm text-muted-foreground'>#{index + 1}</div>
                                    <div className='md:col-span-2'>
                                        <p className='font-medium'>{item.parameter?.name ?? '-'}</p>
                                    </div>
                                    <div>
                                        <p className='text-sm'>{item.method?.name ?? '-'}</p>
                                        <p className='text-xs text-muted-foreground'>{item.method?.code ?? '-'}</p>
                                    </div>
                                    <div className='text-sm'>{item.unit ?? '-'}</div>
                                    <div className='text-sm'>{item.is_required ? 'Wajib' : 'Opsional'}</div>
                                    <div className='text-sm text-muted-foreground'>Urutan: {item.sort_order ?? 0}</div>
                                    <div className='flex justify-end gap-1'>
                                        <Button
                                            size='icon'
                                            variant='ghost'
                                            className='h-7 w-7'
                                            title='Edit'
                                            onClick={() => handleEdit(item)}
                                        >
                                            <Pencil className='h-3.5 w-3.5' />
                                        </Button>
                                    </div>
                                </div>
                            ))}
                        </div>
                    )}
                </div>
            </div>

            <ResizableDrawer
                open={isDrawerOpen}
                onOpenChange={setIsDrawerOpen}
                title={selectedParam ? 'Edit Parameter Template Uji' : 'Tambah Parameter Template Uji'}
                description={selectedParam ? `Edit: ${selectedParam.parameter?.name ?? selectedParam.id}` : 'Tambahkan parameter untuk template ini'}
            >
                <TestTemplateParamForm
                    testTemplate={testTemplate}
                    parameterOptions={parameterOptions}
                    methodOptions={methodOptions}
                    param={selectedParam}
                    onSuccess={() => setIsDrawerOpen(false)}
                    onCancel={() => setIsDrawerOpen(false)}
                />
            </ResizableDrawer>

            <DeleteConfirmationDialog
                open={isDeleteOpen}
                onOpenChange={setIsDeleteOpen}
                onConfirm={handleDeleteConfirm}
                itemName={paramToDelete?.parameter?.name}
                isDeleting={isDeleting}
            />
        </LimsAppLayout>
    )
}
