"use client" import { useState } from "react" import { useApi } from "@/lib/use-api" import { DashboardLayout } from "@/components/dashboard-layout" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Badge } from "@/components/ui/badge" import { Search, Plus, Edit, Trash2, Save } from "lucide-react" import { apiFetch } from "@/lib/apiutils" import { useSWRConfig } from "swr" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Label } from "@/components/ui/label" import { toast } from "sonner" interface Prestador { id: number nombre: string email: string | null telefono: string | null tipo_producto: string | null status: string } export default function PrestadoresPage() { const { data: prestadores, isLoading, error } = useApi("/prestadores") const [searchTerm, setSearchTerm] = useState("") const { mutate } = useSWRConfig() const [isDialogOpen, setIsDialogOpen] = useState(false) const [editingPrestador, setEditingPrestador] = useState(null) const [formData, setFormData] = useState({ nombre: "", email: "", telefono: "", tipo_producto: "", status: "activo", }) const [loading, setLoading] = useState(false) const filteredPrestadores = prestadores ? prestadores.filter((p: any) => p.nombre.toLowerCase().includes(searchTerm.toLowerCase()) || p.email?.toLowerCase().includes(searchTerm.toLowerCase()) ) : [] const handleDelete = async (id: number) => { if (confirm("¿Estás seguro de eliminar este prestador?")) { try { const res = await apiFetch(`/prestadores/${id}`, { method: "DELETE" }) if (res.ok) { mutate("/prestadores") } else { toast.error("Error al eliminar") } } catch (e) { toast.error("Error de conexión") } } } const handleOpenDialog = (prestador?: Prestador) => { if (prestador) { setEditingPrestador(prestador) setFormData({ nombre: prestador.nombre, email: prestador.email || "", telefono: prestador.telefono || "", tipo_producto: prestador.tipo_producto || "", status: prestador.status || "activo", }) } else { setEditingPrestador(null) setFormData({ nombre: "", email: "", telefono: "", tipo_producto: "", status: "activo" }) } setIsDialogOpen(true) } const handleSave = async (e: React.FormEvent) => { e.preventDefault() if (!formData.nombre) { toast.error("El Nombre / Razón Social es obligatorio.") return } setLoading(true) try { const url = editingPrestador ? `/prestadores/${editingPrestador.id}` : "/prestadores" const method = editingPrestador ? "PUT" : "POST" const res = await apiFetch(url, { method, body: JSON.stringify(formData), }) if (res.ok) { mutate("/prestadores") setIsDialogOpen(false) } else { toast.error("Error al guardar prestador") } } catch (error) { toast.error("Error de conexión") } finally { setLoading(false) } } return (

Prestadores

Gestión de contratistas y fumigadores

{editingPrestador ? "Editar Prestador" : "Nuevo Prestador"} {editingPrestador ? "Modifica los datos del prestador" : "Registra un nuevo prestador o contratista"}
{ if (e.target.value.length <= 100) { setFormData({ ...formData, nombre: e.target.value }) } }} maxLength={100} placeholder="Ej: AgroServicios S.A." required className={formData.nombre.length >= 100 ? 'border-red-500 focus-visible:ring-red-500' : ''} /> {formData.nombre.length >= 100 && (

Has alcanzado el límite máximo de 100 caracteres.

)}
{ if (e.target.value.length <= 100) { setFormData({ ...formData, email: e.target.value }) } }} maxLength={100} placeholder="contacto@ejemplo.com" className={ ((formData.email || "").length >= 100 || (formData.email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(formData.email))) ? 'border-red-500 focus-visible:ring-red-500' : '' } /> {(formData.email || "").length >= 100 && (

Has alcanzado el límite máximo de 100 caracteres.

)} {formData.email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(formData.email) && (

Formato de correo inválido.

)}
{ const val = e.target.value.replace(/[^\d\s\+\(\)\-]/g, '') if (val.length <= 20) { setFormData({ ...formData, telefono: val }) } }} maxLength={20} placeholder="+54 11 1234-5678" className={(formData.telefono || "").length >= 20 ? 'border-red-500 focus-visible:ring-red-500' : ''} /> {(formData.telefono || "").length >= 20 && (

Has alcanzado el límite máximo de 20 caracteres.

)}
{ if (e.target.value.length <= 100) { setFormData({ ...formData, tipo_producto: e.target.value }) } }} maxLength={100} className={formData.tipo_producto.length >= 100 ? 'border-red-500 focus-visible:ring-red-500' : ''} /> {formData.tipo_producto.length >= 100 && (

Has alcanzado el límite máximo de 100 caracteres.

)}
setSearchTerm(e.target.value)} />
Nombre Contacto Estado Acciones {isLoading ? ( Cargando prestadores... ) : filteredPrestadores.length === 0 ? ( No se encontraron prestadores ) : ( filteredPrestadores.map((prestador: any) => ( {prestador.nombre}
{prestador.email} {prestador.telefono}
{prestador.status === "activo" ? "Activo" : "Inactivo"}
)) )}
) }