"use client" import { useState, useEffect, useMemo } 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 { Label } from "@/components/ui/label" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Textarea } from "@/components/ui/textarea" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Leaf, Plus, Trash2, Save, ArrowLeft, Calendar, MapPin, User } from "lucide-react" import Link from "next/link" import { useRouter, useSearchParams } from "next/navigation" import { useAuth } from "@/lib/auth-context" import { toast } from "sonner" interface Insumo { id: string nombreComercial: string principioActivo: string unidadMedida: string } interface ProductoReceta { id: string insumoId: string nombreProducto: string dosis: number | string unidad: string cantidadTotal: number } export default function NuevaRecetaCampanaPage() { const router = useRouter() const searchParams = useSearchParams() const campaniaId = searchParams.get("id") as string const { user } = useAuth() const campana = { id: campaniaId, nombre: "Soja 2025", establecimiento: "Campo La Esperanza", productor: "Juan Carlos Pérez", cultivo: "Soja", hectareas: 450, } const insumos: Insumo[] = [ { id: "1", nombreComercial: "Glifosato 48%", principioActivo: "Glifosato", unidadMedida: "L" }, { id: "2", nombreComercial: "Urea Granulada", principioActivo: "Nitrógeno 46%", unidadMedida: "kg" }, { id: "3", nombreComercial: "Cipermetrina 25%", principioActivo: "Cipermetrina", unidadMedida: "L" }, { id: "4", nombreComercial: "Fosfato Diamónico", principioActivo: "Fósforo 18%", unidadMedida: "kg" }, { id: "5", nombreComercial: "2,4-D Amina", principioActivo: "2,4-D", unidadMedida: "L" }, { id: "6", nombreComercial: "Atrazina 90%", principioActivo: "Atrazina", unidadMedida: "kg" }, ] const { data: laboresData } = useApi("/labores?status=activo") const defaultLabores = ["Pulverización", "Fertilización", "Siembra", "Barbecho", "Aplicación Foliar", "Cosecha"] const labores: string[] = useMemo(() => { const raw = Array.isArray(laboresData) ? laboresData : (laboresData?.data || []) if (raw && raw.length > 0) { return raw.map((l: any) => l.nombre) } return defaultLabores }, [laboresData]) const [numeroReceta, setNumeroReceta] = useState("") const [fechaActual, setFechaActual] = useState("") const [loteNumero, setLoteNumero] = useState("") const [superficie, setSuperficie] = useState(campana.hectareas) const [superficieAplicable, setSuperficieAplicable] = useState(campana.hectareas) const [labor, setLabor] = useState("") const [momentoDia, setMomentoDia] = useState("") const [productos, setProductos] = useState([ { id: "1", insumoId: "", nombreProducto: "", dosis: 0, unidad: "L/ha", cantidadTotal: 0 }, ]) const [aplicarConViento, setAplicarConViento] = useState("") const [vientoDireccion, setVientoDireccion] = useState([]) const [vientoIntensidad, setVientoIntensidad] = useState("") const [caudal, setCaudal] = useState("") const [pastillas, setPastillas] = useState("") const [gotas, setGotas] = useState("") const [deriva, setDeriva] = useState("") const [observaciones, setObservaciones] = useState("") const [ingenieroResponsable, setIngenieroResponsable] = useState("") const [matricula, setMatricula] = useState("") useEffect(() => { setNumeroReceta("(Autogenerado)") const fecha = new Date().toLocaleDateString("es-AR", { day: "2-digit", month: "2-digit", year: "numeric", }) setFechaActual(fecha) }, []) useEffect(() => { if (user) { setIngenieroResponsable((prev) => prev || user.name || "") if (user.matricula) { setMatricula((prev) => prev || user.matricula || "") } } }, [user]) const agregarProducto = () => { const nuevoProducto: ProductoReceta = { id: String(Date.now()), insumoId: "", nombreProducto: "", dosis: 0, unidad: "L/ha", cantidadTotal: 0, } setProductos([...productos, nuevoProducto]) } const eliminarProducto = (id: string) => { setProductos(productos.filter((p) => p.id !== id)) } const actualizarProducto = (id: string, campo: keyof ProductoReceta, valor: any) => { setProductos( productos.map((p) => { if (p.id === id) { const productoActualizado = { ...p, [campo]: valor } if (campo === "insumoId" && valor) { const insumo = insumos.find((i) => i.id === valor) if (insumo) { productoActualizado.nombreProducto = insumo.nombreComercial productoActualizado.unidad = `${insumo.unidadMedida}/ha` } } if (campo === "dosis" || (campo === "insumoId" && Number(productoActualizado.dosis) > 0)) { productoActualizado.cantidadTotal = Number((Number(productoActualizado.dosis) * Number(superficieAplicable)).toFixed(3)) } return productoActualizado } return p }), ) } useEffect(() => { setProductos( productos.map((p) => ({ ...p, cantidadTotal: Number((Number(p.dosis) * Number(superficieAplicable)).toFixed(3)), })), ) }, [superficieAplicable]) const handleGuardar = () => { toast.success(`Receta guardada y vinculada a la campaña ${campana.nombre}!`) router.push(`/dashboard/campanas/detalle?id=${campana.id}`) } return (

Nueva Labor / Receta

Campaña: {campana.nombre}

AgroRecetas
Orden de Trabajo - {campana.nombre}
{numeroReceta}

{fechaActual}

{campana.productor}
{campana.establecimiento}
{campana.cultivo}
Detalles de la Labor Información técnica del área de aplicación
{ if (e.target.value.length <= 50) { setLoteNumero(e.target.value) } }} maxLength={50} placeholder="Ej: L-3A" className={loteNumero.length >= 50 ? 'border-red-500 focus-visible:ring-red-500' : ''} /> {loteNumero.length >= 50 && (

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

)}
setSuperficieAplicable(parseFloat(e.target.value) || 0)} onKeyDown={(e) => { if (e.ctrlKey || e.metaKey || e.key.length > 1) return; if (!/[0-9.,]/.test(e.key)) { e.preventDefault(); } }} className="font-mono bg-primary/5 border-primary/20" />
Tabla de Mezcla - Productos Formulación y dosificación de insumos
Producto Dosis Unidad Cantidad Total {productos.map((producto) => ( { const val = e.target.value; if (val === "") { actualizarProducto(producto.id, "dosis", ""); } else { actualizarProducto(producto.id, "dosis", val); } }} onKeyDown={(e) => { if (e.ctrlKey || e.metaKey || e.key.length > 1) return; if (!/[0-9.,]/.test(e.key)) { e.preventDefault(); } }} className="font-mono" />
{producto.unidad.split("/")[0]}
{productos.length > 1 && ( )}
))}
{superficieAplicable > 0 && (

Nota: Las cantidades totales se calculan automáticamente multiplicando la dosis por la superficie aplicable ({superficieAplicable} ha)

)}
Condiciones Ambientales y Técnicas Parámetros de aplicación y observaciones
{aplicarConViento === "SI" && (
{["N", "S", "E", "O", "NE", "NO", "SE", "SO"].map((dir) => ( ))} {vientoDireccion.length > 0 && ( ({vientoDireccion.join(", ")}) )}
)} {aplicarConViento === "SI" && (
)}
{ if (e.target.value.length <= 50) setCaudal(e.target.value) }} maxLength={50} placeholder="Ej: 100" type="text" className={caudal.length >= 50 ? 'border-red-500 focus-visible:ring-red-500' : ''} /> {caudal.length >= 50 && (

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

)}
{ if (e.target.value.length <= 50) setPastillas(e.target.value) }} maxLength={50} placeholder="Ej: XR 110-03" type="text" className={pastillas.length >= 50 ? 'border-red-500 focus-visible:ring-red-500' : ''} /> {pastillas.length >= 50 && (

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

)}
{ if (e.target.value.length <= 50) setGotas(e.target.value) }} maxLength={50} placeholder="Ej: 50-70" type="text" className={gotas.length >= 50 ? 'border-red-500 focus-visible:ring-red-500' : ''} /> {gotas.length >= 50 && (

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

)}
{ if (e.target.value.length <= 50) setDeriva(e.target.value) }} maxLength={50} placeholder="Ej: Baja / Media" type="text" className={deriva.length >= 50 ? 'border-red-500 focus-visible:ring-red-500' : ''} /> {deriva.length >= 50 && (

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

)}