"use client" import { useState, useEffect } from "react" import { AppLayout } from "@/components/app-layout" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { Plus, Pencil, Trash2, ArrowLeft, Loader2, AlertCircle } from "lucide-react" import Link from "next/link" import { Textarea } from "@/components/ui/textarea" import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert" interface Organismo { id: number nombre: string descripcion?: string estado: boolean } export default function OrganismosPage() { const [organismos, setOrganismos] = useState([]) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState(null) const [isDialogOpen, setIsDialogOpen] = useState(false) const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false) const [editingItem, setEditingItem] = useState(null) const [deletingItem, setDeletingItem] = useState(null) const [formData, setFormData] = useState({ nombre: "", descripcion: "", estado: true }) const [isSaving, setIsSaving] = useState(false) const fetchOrganismos = async () => { setIsLoading(true) setError(null) try { const token = localStorage.getItem("token") if (!token) throw new Error("No autenticado") const response = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/api/organismos`, { headers: { Authorization: `Bearer ${token}`, Accept: "application/json", }, }) if (!response.ok) throw new Error("Error al cargar organismos") const { data } = await response.json() setOrganismos(data) } catch (err) { console.error(err) setError("No se pudieron cargar los organismos") } finally { setIsLoading(false) } } useEffect(() => { fetchOrganismos() }, []) const handleAdd = () => { setEditingItem(null) setFormData({ nombre: "", descripcion: "", estado: true }) setIsDialogOpen(true) } const handleEdit = (item: Organismo) => { setEditingItem(item) setFormData({ nombre: item.nombre, descripcion: item.descripcion || "", estado: item.estado }) setIsDialogOpen(true) } const handleDelete = (item: Organismo) => { setDeletingItem(item) setIsDeleteDialogOpen(true) } const handleSave = async () => { setIsSaving(true) try { const token = localStorage.getItem("token") if (!token) throw new Error("No autenticado") const url = editingItem ? `${process.env.NEXT_PUBLIC_API_URL}/api/organismos/${editingItem.id}` : `${process.env.NEXT_PUBLIC_API_URL}/api/organismos` const method = editingItem ? "PUT" : "POST" const response = await fetch(url, { method, headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}`, Accept: "application/json", }, body: JSON.stringify(formData), }) if (!response.ok) { const errorData = await response.json() throw new Error(errorData.message || "Error al guardar") } await fetchOrganismos() setIsDialogOpen(false) } catch (err: any) { console.error(err) alert(err.message || "Error al guardar el organismo") } finally { setIsSaving(false) } } const confirmDelete = async () => { if (!deletingItem) return setIsSaving(true) try { const token = localStorage.getItem("token") if (!token) throw new Error("No autenticado") const response = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/api/organismos/${deletingItem.id}`, { method: "DELETE", headers: { Authorization: `Bearer ${token}`, Accept: "application/json", }, }) if (!response.ok) throw new Error("Error al eliminar") await fetchOrganismos() setIsDeleteDialogOpen(false) } catch (err) { console.error(err) alert("Error al eliminar el organismo. Puede que esté en uso.") } finally { setIsSaving(false) setDeletingItem(null) } } return (

Organismos

Administrar organismos y entidades

{error && ( Error {error} )}
{isLoading ? (
) : ( Nombre Descripción Estado Acciones {organismos.length === 0 ? ( No hay organismos registrados ) : ( organismos.map((organismo) => ( {organismo.nombre} {organismo.descripcion || "-"} {organismo.estado ? "Activo" : "Inactivo"}
)) )}
)}
{editingItem ? "Editar" : "Agregar"} Organismo {editingItem ? "Modifica los datos del organismo" : "Completa los datos para crear un nuevo organismo"}
setFormData({ ...formData, nombre: e.target.value })} placeholder="Ej: AFIP" />