"use client" import { useState } from "react" import { DashboardLayout } from "@/components/dashboard-layout" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Textarea } from "@/components/ui/textarea" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Plus, Pencil, Search, MapPin, User, LayoutGrid, Sprout, Power } from "lucide-react" import Link from "next/link" import { Badge } from "@/components/ui/badge" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" interface Establecimiento { id: string nombre: string ubicacion?: string productorId: string productorNombre: string hectareas: number status: "activo" | "inactivo" observaciones?: string lastActiveCampaignId?: string } import { apiFetch, getErrorMessage } from "@/lib/apiutils" import { useEffect } from "react" import { PaginationControl } from "@/components/ui/pagination-control" import { LotesDialog } from "./lotes-dialog" import { toast } from "sonner" // ... imports interface Productor { id: string nombre: string } export default function EstablecimientosPage() { const [establecimientos, setEstablecimientos] = useState([]) const [productores, setProductores] = useState([]) const [isLoading, setIsLoading] = useState(true) const [currentPage, setCurrentPage] = useState(1) const [lastPage, setLastPage] = useState(1) const [total, setTotal] = useState(0) const [stats, setStats] = useState({ total: 0, activos: 0, total_hectareas: 0 }) const [statusFilter, setStatusFilter] = useState<"activo" | "inactivo" | "all">("activo") const [searchTerm, setSearchTerm] = useState("") // Lotes State const [isLotesDialogOpen, setIsLotesDialogOpen] = useState(false) const [selectedEstablecimientoForLotes, setSelectedEstablecimientoForLotes] = useState(null) const handleOpenLotesDialog = (establecimiento: Establecimiento) => { setSelectedEstablecimientoForLotes(establecimiento) setIsLotesDialogOpen(true) } const fetchData = async () => { setIsLoading(true) try { const queryParams = new URLSearchParams() queryParams.append("page", currentPage.toString()) if (statusFilter !== "all") { queryParams.append("status", statusFilter) } if (searchTerm.trim() !== "") { queryParams.append("search", searchTerm) } const [estRes, prodRes] = await Promise.all([ apiFetch(`/establecimientos?${queryParams.toString()}`), apiFetch("/productores?all=true&status=activo") ]) if (estRes.ok && prodRes.ok) { const estData = await estRes.json() const prodData = await prodRes.json() const dataList = estData.data || [] setLastPage(estData.last_page || 1) setTotal(estData.total || 0) setStats(estData.stats || { total: 0, activos: 0, total_hectareas: 0 }) const mappedEst = dataList.map((e: any) => ({ ...e, id: e.id.toString(), productorId: e.productor_id.toString(), productorNombre: e.productor?.nombre || "Desconocido", hectareas: Number(e.hectareas), observaciones: e.observaciones || "", lastActiveCampaignId: e.last_active_campaign_id ? String(e.last_active_campaign_id) : undefined })) const rawProd = prodData.data || [] const mappedProd = rawProd.map((p: any) => ({ id: p.id.toString(), nombre: p.nombre })) setEstablecimientos(mappedEst) setProductores(mappedProd) } } catch (e) { console.error(e) } finally { setIsLoading(false) } } useEffect(() => { fetchData() }, [currentPage, statusFilter, searchTerm]) const [isDialogOpen, setIsDialogOpen] = useState(false) const [editingEstablecimiento, setEditingEstablecimiento] = useState(null) /* Reset page when filter changes */ useEffect(() => { setCurrentPage(1) }, [statusFilter, searchTerm]) const [formData, setFormData] = useState>({ nombre: "", ubicacion: "", productorId: "", hectareas: 0, status: "activo", observaciones: "", }) const filteredEstablecimientos = establecimientos const handleOpenDialog = (establecimiento?: Establecimiento) => { if (establecimiento) { setEditingEstablecimiento(establecimiento) const { id, productorNombre, ...estData } = establecimiento setFormData({ nombre: estData.nombre || "", ubicacion: estData.ubicacion || "", productorId: estData.productorId || "", hectareas: estData.hectareas || 0, status: estData.status || "activo", observaciones: estData.observaciones || "", }) } else { setEditingEstablecimiento(null) setFormData({ nombre: "", ubicacion: "", productorId: "", hectareas: 0, status: "activo", observaciones: "", }) } setIsDialogOpen(true) } const handleSave = async () => { try { const payload = { ...formData, hectareas: Number(formData.hectareas) || 0, productor_id: formData.productorId } let res; if (editingEstablecimiento) { res = await apiFetch(`/establecimientos/${editingEstablecimiento.id}`, { method: 'PUT', body: JSON.stringify(payload) }) } else { res = await apiFetch('/establecimientos', { method: 'POST', body: JSON.stringify(payload) }) } if (res.ok) { fetchData() setIsDialogOpen(false) } else { const msg = await getErrorMessage(res) toast.error(msg) } } catch (e) { console.error(e) toast.error("Error de conexión") } } const handleToggleStatus = async (establecimiento: Establecimiento) => { const newStatus = establecimiento.status === "activo" ? "inactivo" : "activo" const action = newStatus === "activo" ? "activar" : "desactivar" if (confirm(`¿Estás seguro de que deseas ${action} este establecimiento?`)) { try { const res = await apiFetch(`/establecimientos/${establecimiento.id}`, { method: 'PUT', body: JSON.stringify({ status: newStatus }) }) if (res.ok) { fetchData() } else { toast.error("Error al actualizar estado") } } catch (e) { console.error(e) toast.error("Error de conexión") } } } return (

Gestión de Establecimientos

Administra los campos y establecimientos

{editingEstablecimiento ? "Editar Establecimiento" : "Nuevo Establecimiento"} {editingEstablecimiento ? "Modifica la información del establecimiento" : "Completa los datos para registrar un nuevo establecimiento"}
{ if (e.target.value.length <= 100) { setFormData({ ...formData, nombre: e.target.value }) } }} maxLength={100} placeholder="Campo La Esperanza" 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 <= 150) { setFormData({ ...formData, ubicacion: e.target.value }) } }} maxLength={150} placeholder="Ruta 9 Km 245, Provincia" className={(formData.ubicacion || "").length >= 150 ? 'border-red-500 focus-visible:ring-red-500' : ''} /> {(formData.ubicacion || "").length >= 150 && (

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

)}
{ const val = e.target.value; if (val === "") { setFormData({ ...formData, hectareas: "" as any }); } else { setFormData({ ...formData, hectareas: Number(val) }); } }} onKeyDown={(e) => { if (e.ctrlKey || e.metaKey || e.key.length > 1) return; if (!/[0-9.,]/.test(e.key)) { e.preventDefault(); } }} placeholder="0" />