"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 { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Textarea } from "@/components/ui/textarea" import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert" interface Jurisdiccion { id: number tipo: "nacion" | "provincia" | "municipio" nombre: string descripcion?: string estado: boolean } export default function JurisdiccionesPage() { const [jurisdicciones, setJurisdicciones] = 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({ tipo: "", nombre: "", descripcion: "", estado: true }) const [isSaving, setIsSaving] = useState(false) const fetchJurisdicciones = 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/jurisdicciones`, { headers: { Authorization: `Bearer ${token}`, Accept: "application/json", }, }) if (!response.ok) throw new Error("Error al cargar jurisdicciones") const { data } = await response.json() setJurisdicciones(data) } catch (err) { console.error(err) setError("No se pudieron cargar las jurisdicciones") } finally { setIsLoading(false) } } useEffect(() => { fetchJurisdicciones() }, []) const handleAdd = () => { setEditingItem(null) setFormData({ tipo: "", nombre: "", descripcion: "", estado: true }) setIsDialogOpen(true) } const handleEdit = (item: Jurisdiccion) => { setEditingItem(item) setFormData({ tipo: item.tipo, nombre: item.nombre, descripcion: item.descripcion || "", estado: item.estado }) setIsDialogOpen(true) } const handleDelete = (item: Jurisdiccion) => { 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/jurisdicciones/${editingItem.id}` : `${process.env.NEXT_PUBLIC_API_URL}/api/jurisdicciones` 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 fetchJurisdicciones() setIsDialogOpen(false) } catch (err: any) { console.error(err) alert(err.message || "Error al guardar la jurisdicción") } 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/jurisdicciones/${deletingItem.id}`, { method: "DELETE", headers: { Authorization: `Bearer ${token}`, Accept: "application/json", }, }) if (!response.ok) throw new Error("Error al eliminar") await fetchJurisdicciones() setIsDeleteDialogOpen(false) } catch (err) { console.error(err) alert("Error al eliminar la jurisdicción. Puede que esté en uso.") } finally { setIsSaving(false) setDeletingItem(null) } } return (

Jurisdicciones

Configurar jurisdicciones (nación, provincias, municipios)

{error && ( Error {error} )}
{isLoading ? (
) : ( Tipo Nombre Descripción Estado Acciones {jurisdicciones.length === 0 ? ( No hay jurisdicciones registradas ) : ( jurisdicciones.map((jurisdiccion) => { const tipoColors = { nacion: "bg-blue-500/10 text-blue-700 border-blue-500/20", provincia: "bg-purple-500/10 text-purple-700 border-purple-500/20", municipio: "bg-yellow-500/10 text-yellow-700 border-yellow-500/20" } return ( {jurisdiccion.tipo} {jurisdiccion.nombre} {jurisdiccion.descripcion || "-"} {jurisdiccion.estado ? "Activo" : "Inactivo"}
) }) )}
)}
{editingItem ? "Editar" : "Agregar"} Jurisdicción {editingItem ? "Modifica los datos de la jurisdicción" : "Completa los datos para crear una nueva jurisdicción"}
setFormData({ ...formData, nombre: e.target.value })} placeholder="Ej: Buenos Aires" />