import { useState } from 'react';
import { Plus, Edit, Trash2, MoreVertical } from 'lucide-react';
import { PageHeader } from '@/components/common/PageHeader';
import { ServerDataTable } from '@/components/common/ServerDataTable';
import { Button } from '@/components/ui/button';
import {
    DropdownMenu,
    DropdownMenuContent,
    DropdownMenuItem,
    DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
import { useOrgUnits } from '@/hooks/useOrgUnits';
import { OrgUnitDTO } from '@/types/org';
import { useToast } from '@/hooks/use-toast';
import { ConfirmDialog } from '@/components/common/ConfirmDialog';
import { OrgUnitFormModal } from './components/OrgUnitFormModal';

export function OrgUnitList() {
    const [searchTerm, setSearchTerm] = useState('');
    const [selectedOrgUnit, setSelectedOrgUnit] = useState<OrgUnitDTO | null>(null);
    const [isFormOpen, setIsFormOpen] = useState(false);
    const [isDeleteOpen, setIsDeleteOpen] = useState(false);
    const { toast } = useToast();

    const {
        orgUnits,
        loading,
        error,
        page,
        totalPages,
        totalElements,
        setPage,
        createOrgUnit,
        updateOrgUnit,
    } = useOrgUnits({
        page: 0,
        size: 20,
        sortBy: 'code',
        sortDirection: 'ASC',
    });

    const filteredOrgUnits = orgUnits.filter((ou) =>
        ou.name.toLowerCase().includes(searchTerm.toLowerCase()) ||
        ou.code.toLowerCase().includes(searchTerm.toLowerCase()) ||
        ou.acronym.toLowerCase().includes(searchTerm.toLowerCase())
    );

    const handleCreate = () => {
        setSelectedOrgUnit(null);
        setIsFormOpen(true);
    };

    const handleEdit = (orgUnit: OrgUnitDTO) => {
        setSelectedOrgUnit(orgUnit);
        setIsFormOpen(true);
    };

    const handleDelete = (orgUnit: OrgUnitDTO) => {
        setSelectedOrgUnit(orgUnit);
        setIsDeleteOpen(true);
    };

    const handleDeleteConfirm = async () => {
        if (!selectedOrgUnit) return;
        toast({
            title: 'Info',
            description: 'Funcionalidade de exclusão ainda não implementada na API',
        });
        setIsDeleteOpen(false);
        setSelectedOrgUnit(null);
    };

    const handleFormSubmit = async (data: any) => {
        try {
            if (selectedOrgUnit) {
                await updateOrgUnit(selectedOrgUnit.id, data);
                toast({
                    title: 'Sucesso',
                    description: 'Unidade orgânica atualizada com sucesso',
                });
            } else {
                await createOrgUnit(data);
                toast({
                    title: 'Sucesso',
                    description: 'Unidade orgânica criada com sucesso',
                });
            }
            setIsFormOpen(false);
            setSelectedOrgUnit(null);
        } catch (err: any) {
            toast({
                title: 'Erro',
                description: err.message || 'Erro ao salvar unidade orgânica',
                variant: 'destructive',
            });
        }
    };

    const typeLabels: Record<string, string> = {
        MINISTRY: 'Ministério',
        SECRETARIAT: 'Secretaria',
        DIRECTORATE: 'Direção',
        DEPARTMENT: 'Departamento',
        SECTION: 'Secção',
        OTHER: 'Outro',
    };

    const columns = [
        {
            key: 'code',
            header: 'Código',
            cell: (ou: OrgUnitDTO) => ou.code,
        },
        {
            key: 'acronym',
            header: 'Sigla',
            cell: (ou: OrgUnitDTO) => <span className="font-medium">{ou.acronym}</span>,
        },
        {
            key: 'name',
            header: 'Nome',
            cell: (ou: OrgUnitDTO) => ou.name,
        },
        {
            key: 'type',
            header: 'Tipo',
            cell: (ou: OrgUnitDTO) => typeLabels[ou.type] || ou.type,
        },
        {
            key: 'actions',
            header: 'Ações',
            cell: (ou: OrgUnitDTO) => (
                <DropdownMenu>
                    <DropdownMenuTrigger asChild>
                        <Button variant="ghost" size="sm">
                            <MoreVertical className="h-4 w-4" />
                        </Button>
                    </DropdownMenuTrigger>
                    <DropdownMenuContent align="end">
                        <DropdownMenuItem onClick={() => handleEdit(ou)}>
                            <Edit className="mr-2 h-4 w-4" />
                            Editar
                        </DropdownMenuItem>
                        <DropdownMenuItem
                            onClick={() => handleDelete(ou)}
                            className="text-destructive"
                        >
                            <Trash2 className="mr-2 h-4 w-4" />
                            Excluir
                        </DropdownMenuItem>
                    </DropdownMenuContent>
                </DropdownMenu>
            ),
        },
    ];

    return (
        <div className="space-y-6">
            <PageHeader
                title="Unidades Orgânicas"
                description="Gestão de Unidades Orgânicas (Secretarias, Direções, Departamentos)"
            />

            <div className="flex items-center justify-end gap-4">
                <Button onClick={handleCreate}>
                    <Plus className="mr-2 h-4 w-4" />
                    Nova Unidade
                </Button>
            </div>

            <ServerDataTable
                data={filteredOrgUnits}
                columns={columns}
                loading={loading}
                error={error}
                page={page}
                totalPages={totalPages}
                totalElements={totalElements}
                pageSize={20}
                onPageChange={setPage}
                onSearch={setSearchTerm}
                searchPlaceholder="Pesquisar por nome, código ou sigla..."
                emptyMessage="Nenhuma unidade orgânica encontrada"
            />

            <OrgUnitFormModal
                open={isFormOpen}
                onOpenChange={setIsFormOpen}
                orgUnit={selectedOrgUnit}
                onSubmit={handleFormSubmit}
            />

            <ConfirmDialog
                open={isDeleteOpen}
                onOpenChange={setIsDeleteOpen}
                title="Excluir Unidade Orgânica"
                description={`Tem certeza que deseja excluir a unidade "${selectedOrgUnit?.name}"?`}
                onConfirm={handleDeleteConfirm}
            />
        </div>
    );
}
