import { useCallback, useEffect, useMemo, useState } from 'react' import toast from 'react-hot-toast' import { DESARROLLOS, DEPARTAMENTOS, CAMPOS_POR_DEPARTAMENTO, DEPARTAMENTOS_POR_ROL, DEPARTAMENTO_LABELS, obtenerCaptura, obtenerUnidadesCaptura, obtenerResumenCaptura, guardarBulk, type DatosCaptura, type DepartamentoId, type ResumenDepartamento, } from '../services/captura' import { TablaCaptura, type DirtyMap } from '../components/TablaCaptura' import { ResumenCaptura } from '../components/ResumenCaptura' import { getSesion } from '../services/auth' interface Props { onVolver: () => void } export function CapturaPage({ onVolver }: Props) { // ─── Estado ─────────────────────────────────────────────────────── const [desarrollo, setDesarrollo] = useState(String(DESARROLLOS[0])) const [departamento, setDepartamento] = useState(DEPARTAMENTOS[0]) const [unidades, setUnidades] = useState([]) const [datos, setDatos] = useState({}) const [resumen, setResumen] = useState([]) const [cargando, setCargando] = useState(true) const [error, setError] = useState('') const [guardando, setGuardando] = useState(false) const [filtroEstatus, setFiltroEstatus] = useState('') // ─── Permisos ───────────────────────────────────────────────────── const rol = getSesion()?.usuario.rol ?? 'admin' const departamentosPermitidos = useMemo(() => { return (DEPARTAMENTOS_POR_ROL[rol] ?? DEPARTAMENTOS_POR_ROL['admin']) as DepartamentoId[] }, [rol]) // Si el departamento activo no está permitido, cambiar al primero permitido useEffect(() => { if (departamentosPermitidos.length > 0 && !departamentosPermitidos.includes(departamento)) { setDepartamento(departamentosPermitidos[0]) } }, [departamentosPermitidos, departamento]) // ─── Carga de datos ─────────────────────────────────────────────── const cargar = useCallback(async () => { setCargando(true) setError('') try { const [u, d, r] = await Promise.all([ obtenerUnidadesCaptura(desarrollo), obtenerCaptura(desarrollo), obtenerResumenCaptura(desarrollo), ]) setUnidades(u) setDatos(d) setResumen(r) } catch { setError('No se pudieron cargar los datos de captura.') } finally { setCargando(false) } }, [desarrollo]) useEffect(() => { void cargar() }, [cargar]) // ─── Guardar cambios ────────────────────────────────────────────── const handleGuardar = useCallback( async (dirty: DirtyMap) => { setGuardando(true) try { const registros: { unidad: string; campo: string; valor: string | null }[] = [] for (const [unidad, campos] of Object.entries(dirty)) { for (const [campo, valor] of Object.entries(campos)) { registros.push({ unidad, campo, valor }) } } await guardarBulk({ desarrollo, departamento, registros }) toast.success('Cambios guardados') await cargar() } catch (e) { toast.error( e instanceof Error && e.message && !e.message.startsWith('HTTP') ? e.message : 'No se pudieron guardar los cambios', ) } finally { setGuardando(false) } }, [desarrollo, departamento, cargar], ) // ─── Render ─────────────────────────────────────────────────────── const campos = CAMPOS_POR_DEPARTAMENTO[departamento] ?? [] return (
{/* Header */}

Captura por Departamentos

{/* Filtros */}
{/* Desarrollo */}
{/* Filtro de estatus */}
{/* Tabs de departamento */} {/* Contenido: tabla + resumen */}
{/* Tabla */}
{cargando ? (

Cargando captura…

) : error ? (

{error}

) : ( )}
{/* Resumen lateral */}
) }