import React, { useState, useEffect, useCallback } from 'react';
import {
    Box, Typography, Paper, TextField, Button, CircularProgress, Alert,
    FormControl, InputLabel, Select, MenuItem, Tooltip
} from '@mui/material';
import FilterListIcon from '@mui/icons-material/FilterList';
import { DataGrid, type GridColDef } from '@mui/x-data-grid';
import { esES } from '@mui/x-data-grid/locales';
import auditoriaService from '../../services/Auditoria/auditoriaService';
import type { UsuarioDto } from '../../models/dtos/Usuarios/UsuarioDto';
import usuarioService from '../../services/Usuarios/usuarioService';
import { usePermissions } from '../../hooks/usePermissions';
import type { PublicacionDropdownDto } from '../../models/dtos/Distribucion/PublicacionDropdownDto';
import publicacionService from '../../services/Distribucion/publicacionService';
import type { ZonaDto } from '../../models/dtos/Zonas/ZonaDto';
import zonaService from '../../services/Distribucion/zonaService';
import type { DistribuidorDropdownDto } from '../../models/dtos/Distribucion/DistribuidorDropdownDto';
import distribuidorService from '../../services/Distribucion/distribuidorService';
import type { CanillaDto } from '../../models/dtos/Distribucion/CanillaDto';
import canillaService from '../../services/Distribucion/canillaService';
import empresaService from '../../services/Distribucion/empresaService';
import type { EmpresaDto } from '../../models/dtos/Distribucion/EmpresaDto';
import type { TipoBobinaDto } from '../../models/dtos/Impresion/TipoBobinaDto';
import type { PlantaDto } from '../../models/dtos/Impresion/PlantaDto';
import type { EstadoBobinaDto } from '../../models/dtos/Impresion/EstadoBobinaDto';
import tipoBobinaService from '../../services/Impresion/tipoBobinaService';
import plantaService from '../../services/Impresion/plantaService';
import estadoBobinaService from '../../services/Impresion/estadoBobinaService';
import type { PubliSeccionDto } from '../../models/dtos/Distribucion/PubliSeccionDto';
import publiSeccionService from '../../services/Distribucion/publiSeccionService';
import type { PerfilDto } from '../../models/dtos/Usuarios/PerfilDto';
import type { PermisoDto } from '../../models/dtos/Usuarios/PermisoDto';
import perfilService from '../../services/Usuarios/perfilService';
import permisoService from '../../services/Usuarios/permisoService';

const TIPOS_ENTIDAD_AUDITABLES = [
    { value: "Canillita", label: "Canillitas (Maestro) (dist_dtCanillas_H)" },
    { value: "Distribuidor", label: "Distribuidores (Maestro) (dist_dtDistribuidores_H)" },
    { value: "Empresa", label: "Empresas (Maestro) (dist_dtEmpresas_H)" },
    { value: "Zona", label: "Zonas (Maestro) (dist_dtZonas_H)" },
    { value: "OtroDestino", label: "Otros Destinos (Maestro) (dist_dtOtrosDestinos_H)" },
    { value: "Publicacion", label: "Publicaciones (Maestro) (dist_dtPublicaciones_H)" },
    { value: "PubliSeccion", label: "Secciones de Publicación (dist_dtPubliSecciones_H)" },
    { value: "PrecioPublicacion", label: "Precios de Publicación (dist_Precios_H)" },
    { value: "RecargoZona", label: "Recargos por Zona (dist_RecargoZona_H)" },
    { value: "PorcPagoDistribuidor", label: "Porcentajes Pago Dist. (dist_PorcPago_H)" },
    { value: "PorcMonCanilla", label: "Porcentajes/Montos Canillita (dist_PorcMonPagoCanilla_H)" },
    { value: "EntradaSalidaCanilla", label: "E/S Canillitas (dist_EntradasSalidasCanillas_H)" },
    { value: "EntradaSalidaDist", label: "E/S Distribuidores (dist_EntradasSalidas_H)" },
    { value: "NovedadCanilla", label: "Novedades Canillitas (dist_dtNovedadesCanillas_H)" },
    { value: "ControlDevoluciones", label: "Control Devoluciones (dist_dtCtrlDevoluciones_H)" },
    { value: "PagoDistribuidor", label: "Pagos de Distribuidores (cue_PagosDistribuidor_H)" },
    { value: "NotaCreditoDebito", label: "Notas C/D (cue_CreditosDebitos_H)" },
    { value: "TipoPago", label: "Tipos de Pago (cue_dtTipopago_H)" },
    { value: "SaldoAjuste", label: "Ajustes Manuales de Saldo (cue_SaldoAjustesHistorial)" },
    { value: "TipoBobina", label: "Tipos de Bobina (bob_dtBobinas_H)" },
    { value: "EstadoBobina", label: "Estados de Bobina (bob_dtEstadosBobinas_H)" },
    { value: "PlantaImpresion", label: "Plantas de Impresión (bob_dtPlantas_H)" },
    { value: "StockBobina", label: "Stock de Bobinas (bob_StockBobinas_H)" },
    { value: "RegTirada", label: "Registro de Tirada (bob_RegTiradas_H)" },
    { value: "PerfilMaestro", label: "Perfiles (Maestro) (gral_Perfiles_H)" },
    { value: "PermisoMaestro", label: "Permisos (Definición) (gral_Permisos_H)" },
    { value: "PermisosPerfiles", label: "Asignación de Permisos a Perfiles (gral_PermisosPerfiles_H)" },
    { value: "CambioParada", label: "Cambios de Parada (dist_CambiosParadasCanillas_H)" },
    { value: "CierreCC", label: "Cierres de Cuenta Corriente (cue_CierresCuentaCorriente_H)" },
].sort((a, b) => a.label.localeCompare(b.label));

const TIPOS_MODIFICACION = [
    "Creado", "Creada", "Actualizado", "Actualizada", "Modificado", "Modificada",
    "Eliminado", "Eliminada", "Insertada", "Baja", "Alta", "Liquidada", "AjusteManualSaldo"
].sort();

const AuditoriaGeneralPage: React.FC = () => {
    const [datosAuditoria, setDatosAuditoria] = useState<any[]>([]);
    const [columnasActuales, setColumnasActuales] = useState<GridColDef[]>([]);
    const [loading, setLoading] = useState(false);
    const [error, setError] = useState<string | null>(null);

    const [filtroFechaDesde, setFiltroFechaDesde] = useState<string>(new Date().toISOString().split('T')[0]);
    const [filtroFechaHasta, setFiltroFechaHasta] = useState<string>(new Date().toISOString().split('T')[0]);
    const [filtroIdUsuarioMod, setFiltroIdUsuarioMod] = useState<number | string>('');
    const [filtroTipoEntidad, setFiltroTipoEntidad] = useState<string>('');
    const [filtroIdEntidad, setFiltroIdEntidad] = useState<string>('');
    const [filtroTipoMod, setFiltroTipoMod] = useState<string>('');

    const [filtroIdPublicacionParaSeccion, setFiltroIdPublicacionParaSeccion] = useState<number | string>('');
    const [filtroIdZonaParaRecargo, setFiltroIdZonaParaRecargo] = useState<number | string>('');
    const [filtroIdDistribuidorParaPorc, setFiltroIdDistribuidorParaPorc] = useState<number | string>('');
    const [filtroIdCanillitaParaPorcMon, setFiltroIdCanillitaParaPorcMon] = useState<number | string>('');
    const [filtroIdEmpresa, setFiltroIdEmpresa] = useState<number | string>('');
    const [filtroFechaAfectadaParaCtrlDev, setFiltroFechaAfectadaParaCtrlDev] = useState<string>('');
    const [filtroIdTipoBobina, setFiltroIdTipoBobina] = useState<number | string>('');
    const [filtroIdPlantaStock, setFiltroIdPlantaStock] = useState<number | string>('');
    const [filtroIdEstadoBobina, setFiltroIdEstadoBobina] = useState<number | string>('');
    const [filtroIdPlantaTirada, setFiltroIdPlantaTirada] = useState<number | string>('');
    const [filtroFechaTirada, setFiltroFechaTirada] = useState<string>('');
    const [filtroIdSeccion, setFiltroIdSeccion] = useState<number | string>('');
    const [filtroIdPerfil, setFiltroIdPerfil] = useState<number | string>('');
    const [filtroIdPermiso, setFiltroIdPermiso] = useState<number | string>('');

    const [usuariosDropdown, setUsuariosDropdown] = useState<UsuarioDto[]>([]);
    const [publicacionesDropdown, setPublicacionesDropdown] = useState<PublicacionDropdownDto[]>([]);
    const [zonasDropdown, setZonasDropdown] = useState<ZonaDto[]>([]);
    const [distribuidoresDropdown, setDistribuidoresDropdown] = useState<DistribuidorDropdownDto[]>([]);
    const [canillitasDropdown, setCanillitasDropdown] = useState<CanillaDto[]>([]);
    const [empresasDropdown, setEmpresasDropdown] = useState<EmpresaDto[]>([]);
    const [tiposBobinaDropdown, setTiposBobinaDropdown] = useState<TipoBobinaDto[]>([]);
    const [plantasStockDropdown, setPlantasStockDropdown] = useState<PlantaDto[]>([]);
    const [estadosBobinaDropdown, setEstadosBobinaDropdown] = useState<EstadoBobinaDto[]>([]);
    const [loadingDropdowns, setLoadingDropdowns] = useState(false);
    const [seccionesDropdown, setSeccionesDropdown] = useState<PubliSeccionDto[]>([]);
    const [perfilesDropdown, setPerfilesDropdown] = useState<PerfilDto[]>([]);
    const [permisosDropdown, setPermisosDropdown] = useState<PermisoDto[]>([]);

    const [page, setPage] = useState(0);
    const [rowsPerPage, setRowsPerPage] = useState(25);

    const { tienePermiso, isSuperAdmin } = usePermissions();
    const puedeVerAuditoria = isSuperAdmin || tienePermiso("AU_GENERAL_VIEW");

    const formatDate = (dateString?: string | null): string => {
        // Si es nulo, undefined, o una cadena vacía, devuelve guion
        if (!dateString) return '-';

        // Si es la fecha mínima de .NET, trátala como nula también
        if (dateString.startsWith('0001-01-01')) {
            return '-';
        }
        try {
            return new Date(dateString).toLocaleString('es-AR', {
                day: '2-digit', month: '2-digit', year: 'numeric',
                hour: '2-digit', minute: '2-digit', second: '2-digit',
                // timeZone: 'UTC' // Mantener UTC si las fechas del backend son consistentemente UTC
            });
        } catch (e) { return dateString; }
    };
    const currencyFormatter = (value?: number | null) => value != null ? value.toLocaleString('es-AR', { style: 'currency', currency: 'ARS' }) : '-';
    const numberFormatter = (value?: number | null) => value != null ? Number(value).toLocaleString('es-AR') : '-';

    useEffect(() => {
        const fetchDropdowns = async () => {
            if (!puedeVerAuditoria) return;
            setLoadingDropdowns(true);
            try {
                setUsuariosDropdown(await usuarioService.getAllUsuarios());
                setPublicacionesDropdown(await publicacionService.getPublicacionesForDropdown(false));
                setZonasDropdown(await zonaService.getAllZonas());
                setDistribuidoresDropdown(await distribuidorService.getAllDistribuidoresDropdown());
                setCanillitasDropdown(await canillaService.getAllCanillas(undefined, undefined, true, undefined));
                setEmpresasDropdown(await empresaService.getAllEmpresas());
                setTiposBobinaDropdown(await tipoBobinaService.getAllTiposBobina());
                setPlantasStockDropdown(await plantaService.getAllPlantas()); // O getPlantasForDropdown()
                setEstadosBobinaDropdown(await estadoBobinaService.getAllEstadosBobina());
                if (filtroIdPublicacionParaSeccion) { // Cargar secciones solo si hay una publicación seleccionada
                    const seccData = await publiSeccionService.getSeccionesPorPublicacion(Number(filtroIdPublicacionParaSeccion), false); // Traer todas
                    setSeccionesDropdown(seccData);
                } else {
                    setSeccionesDropdown([]);
                }
                const [perfilesData, permisosData] = await Promise.all([
                    // ...
                    perfilService.getAllPerfiles(),
                    permisoService.getAllPermisos()
                ]);
                setPerfilesDropdown(perfilesData);
                setPermisosDropdown(permisosData);
            } catch (e) {
                console.error("Error cargando datos para filtros de auditoría", e);
                setError("Error al cargar datos para filtros.");
            }
            finally { setLoadingDropdowns(false); }
        };
        fetchDropdowns();
    }, [puedeVerAuditoria]);

    const getCommonAuditColumns = (): GridColDef[] => [
        { field: 'fechaMod', headerName: 'Fecha Mod.', width: 170, type: 'dateTime', valueFormatter: (value) => formatDate(value as string) },
        { field: 'nombreUsuarioModifico', headerName: 'Modificado Por', width: 180, flex: 0.8 },
        { field: 'tipoMod', headerName: 'Acción', width: 120, flex: 0.5 },
    ];

    const cargarHistorial = useCallback(async () => {
        if (!puedeVerAuditoria) {
            setError("No tiene permiso para ver la auditoría."); setLoading(false); return;
        }
        if (!filtroTipoEntidad) {
            setError("Debe seleccionar un 'Tipo de Entidad a Auditar' para buscar.");
            setDatosAuditoria([]); setColumnasActuales(getCommonAuditColumns()); setLoading(false); return;
        }
        setLoading(true); setError(null);

        try {
            const commonParams = {
                fechaDesde: filtroFechaDesde || undefined,
                fechaHasta: filtroFechaHasta || undefined,
                idUsuarioModificador: filtroIdUsuarioMod ? Number(filtroIdUsuarioMod) : undefined,
                tipoModificacion: filtroTipoMod || undefined,
            };

            let rawData: any[] = [];
            let cols: GridColDef[] = getCommonAuditColumns();

            switch (filtroTipoEntidad) {
                case "Usuario":
                    const userHist = await auditoriaService.getHistorialUsuarios({ ...commonParams, idUsuarioAfectado: filtroIdEntidad ? Number(filtroIdEntidad) : undefined });
                    rawData = userHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'userAfectado', headerName: 'User Afectado', width: 150, flex: 0.6 },
                        { field: 'idUsuarioAfectado', headerName: 'ID User Afect.', width: 110, align: 'center', headerAlign: 'center' },
                        { field: 'userNvo', headerName: 'User (Nvo)', width: 130, valueGetter: (value, row) => row.userAnt !== value ? value : '' },
                        { field: 'userAnt', headerName: 'User (Ant)', width: 130 },
                        { field: 'nombreNvo', headerName: 'Nombre (Nvo)', width: 150, valueGetter: (value, row) => row.nombreAnt !== value ? value : '' },
                        { field: 'nombreAnt', headerName: 'Nombre (Ant)', width: 150 },
                        { field: 'apellidoNvo', headerName: 'Apellido (Nvo)', width: 150, valueGetter: (value, row) => row.apellidoAnt !== value ? value : '' },
                        { field: 'apellidoAnt', headerName: 'Apellido (Ant)', width: 150 },
                        { field: 'nombrePerfilNvo', headerName: 'Perfil (Nvo)', width: 150, valueGetter: (value, row) => row.nombrePerfilAnt !== value ? value : '' },
                        { field: 'nombrePerfilAnt', headerName: 'Perfil (Ant)', width: 150 },
                        { field: 'habilitadaNva', headerName: 'Hab. (Nvo)', width: 100, type: 'boolean', valueGetter: (value, row) => row.habilitadaAnt !== value ? value : null },
                        { field: 'habilitadaAnt', headerName: 'Hab. (Ant)', width: 100, type: 'boolean' },
                        { field: 'supAdminNvo', headerName: 'SupAdm (Nvo)', width: 100, type: 'boolean', valueGetter: (value, row) => row.supAdminAnt !== value ? value : null },
                        { field: 'supAdminAnt', headerName: 'SupAdm (Ant)', width: 100, type: 'boolean' },
                        { field: 'debeCambiarClaveNva', headerName: 'CambiaClave (Nvo)', width: 100, type: 'boolean', valueGetter: (value, row) => row.debeCambiarClaveAnt !== value ? value : null },
                        { field: 'debeCambiarClaveAnt', headerName: 'CambiaClave (Ant)', width: 100, type: 'boolean' },
                    ];
                    break;
                case "PagoDistribuidor":
                    const pagoHist = await auditoriaService.getHistorialPagosDistribuidor({ ...commonParams, idPagoAfectado: filtroIdEntidad ? Number(filtroIdEntidad) : undefined });
                    rawData = pagoHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_Pago', headerName: 'ID Pago', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'id_Distribuidor', headerName: 'ID Dist.', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'id_Empresa', headerName: 'ID Emp.', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'fecha', headerName: 'Fecha Pago', width: 120, type: 'date', valueFormatter: (value) => formatDate(value as string) },
                        { field: 'recibo', headerName: 'Recibo', width: 100 },
                        { field: 'tipoMovimiento', headerName: 'Tipo Mov.', width: 120 },
                        { field: 'monto', headerName: 'Monto Pago', width: 130, type: 'number', valueFormatter: (v) => currencyFormatter(v as number) },
                        { field: 'id_TipoPago', headerName: 'ID Tipo Pago', width: 110, align: 'center', headerAlign: 'center' },
                        { field: 'detalle', headerName: 'Detalle Pago', flex: 1, minWidth: 150, renderCell: (params) => (<Tooltip title={params.value || ''}><Typography noWrap variant="body2">{params.value || '-'}</Typography></Tooltip>) },
                    ];
                    break;
                case "NotaCreditoDebito":
                    const notaCDHist = await auditoriaService.getHistorialNotasCD({ ...commonParams, idNotaAfectada: filtroIdEntidad ? Number(filtroIdEntidad) : undefined });
                    rawData = notaCDHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_Nota', headerName: 'ID Nota', width: 110, align: 'center', headerAlign: 'center' },
                        { field: 'destino', headerName: 'Destino', width: 120 },
                        { field: 'id_Destino', headerName: 'ID Dest.', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'id_Empresa', headerName: 'ID Emp.', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'tipo', headerName: 'Tipo Nota', width: 100 },
                        { field: 'fecha', headerName: 'Fecha Nota', width: 120, type: 'date', valueFormatter: (value) => formatDate(value as string) },
                        { field: 'monto', headerName: 'Monto Nota', width: 130, type: 'number', valueFormatter: (v) => currencyFormatter(v as number) },
                        { field: 'referencia', headerName: 'Referencia', width: 150, renderCell: (params) => (<Tooltip title={params.value || ''}><Typography noWrap variant="body2">{params.value || '-'}</Typography></Tooltip>) },
                        { field: 'observaciones', headerName: 'Obs. Nota', flex: 1, minWidth: 150, renderCell: (params) => (<Tooltip title={params.value || ''}><Typography noWrap variant="body2">{params.value || '-'}</Typography></Tooltip>) },
                    ];
                    break;
                case "EntradaSalidaDist":
                    const esDistHist = await auditoriaService.getHistorialEntradasSalidasDist({ ...commonParams, idParteAfectada: filtroIdEntidad ? Number(filtroIdEntidad) : undefined });
                    rawData = esDistHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_Parte', headerName: 'ID Mov.', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'id_Publicacion', headerName: 'ID Pub.', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'id_Distribuidor', headerName: 'ID Dist.', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'fecha', headerName: 'Fecha Mov.', width: 120, type: 'date', valueFormatter: (value) => formatDate(value as string) },
                        { field: 'tipoMovimiento', headerName: 'Tipo', width: 100 },
                        { field: 'cantidad', headerName: 'Cantidad', width: 100, type: 'number', valueFormatter: (v) => numberFormatter(v as number) },
                        { field: 'remito', headerName: 'Remito', width: 100, type: 'number' },
                        { field: 'observacion', headerName: 'Obs. Mov.', flex: 1, minWidth: 150, renderCell: (params) => (<Tooltip title={params.value || ''}><Typography noWrap variant="body2">{params.value || '-'}</Typography></Tooltip>) },
                    ];
                    break;
                case "EntradaSalidaCanilla":
                    const esCanillaHist = await auditoriaService.getHistorialEntradasSalidasCanilla({ ...commonParams, idParteAfectada: filtroIdEntidad ? Number(filtroIdEntidad) : undefined });
                    rawData = esCanillaHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_Parte', headerName: 'ID Mov.', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'id_Publicacion', headerName: 'ID Pub.', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'id_Canilla', headerName: 'ID Can.', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'fecha', headerName: 'Fecha Mov.', width: 120, type: 'date', valueFormatter: (value) => formatDate(value as string) },
                        { field: 'cantSalida', headerName: 'Salida', width: 90, type: 'number', valueFormatter: (v) => numberFormatter(v as number) },
                        { field: 'cantEntrada', headerName: 'Entrada', width: 90, type: 'number', valueFormatter: (v) => numberFormatter(v as number) },
                        { field: 'observacion', headerName: 'Obs. Mov.', flex: 1, minWidth: 150, renderCell: (params) => (<Tooltip title={params.value || ''}><Typography noWrap variant="body2">{params.value || '-'}</Typography></Tooltip>) },
                    ];
                    break;
                case "NovedadCanilla":
                    const novedadHist = await auditoriaService.getHistorialNovedadesCanilla({ ...commonParams, idNovedadAfectada: filtroIdEntidad ? Number(filtroIdEntidad) : undefined });
                    rawData = novedadHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_Novedad', headerName: 'ID Novedad', width: 110, align: 'center', headerAlign: 'center' },
                        { field: 'id_Canilla', headerName: 'ID Canillita', width: 110, align: 'center', headerAlign: 'center' },
                        { field: 'fecha', headerName: 'Fecha Novedad', width: 120, type: 'date', valueFormatter: (value) => formatDate(value as string) },
                        { field: 'detalle', headerName: 'Detalle Novedad', flex: 1, minWidth: 250, renderCell: (params) => (<Tooltip title={params.value || ''}><Typography noWrap variant="body2" sx={{ width: '100%' }}>{params.value || '-'}</Typography></Tooltip>) },
                    ];
                    break;
                case "SaldoAjuste":
                    const ajusteHist = await auditoriaService.getHistorialAjustesSaldo({ ...commonParams, idDestino: filtroIdEntidad ? Number(filtroIdEntidad) : undefined, destino: undefined, idEmpresa: filtroIdEmpresa ? Number(filtroIdEmpresa) : undefined });
                    rawData = ajusteHist;
                    cols = [
                        { field: 'fechaAjuste', headerName: 'Fecha Ajuste', width: 170, type: 'dateTime', valueFormatter: (value) => formatDate(value as string) },
                        { field: 'nombreUsuarioModifico', headerName: 'Ajustado Por', width: 180, flex: 0.8 },
                        { field: 'destino', headerName: 'Tipo Dest.', width: 120 },
                        { field: 'id_Destino', headerName: 'ID Dest.', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'id_Empresa', headerName: 'ID Emp.', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'montoAjuste', headerName: 'Monto Ajuste', width: 130, type: 'number', valueFormatter: (v) => currencyFormatter(v as number) },
                        { field: 'saldoAnterior', headerName: 'Saldo Ant.', width: 130, type: 'number', valueFormatter: (v) => currencyFormatter(v as number) },
                        { field: 'saldoNuevo', headerName: 'Saldo Nvo.', width: 130, type: 'number', valueFormatter: (v) => currencyFormatter(v as number) },
                        { field: 'justificacion', headerName: 'Justificación', flex: 1, minWidth: 200, renderCell: (params) => (<Tooltip title={params.value || ''}><Typography noWrap variant="body2" sx={{ width: '100%' }}>{params.value || '-'}</Typography></Tooltip>) },
                    ];
                    break;
                case "TipoPago":
                    const tipoPagoHist = await auditoriaService.getHistorialTiposPago({ ...commonParams, idTipoPagoAfectado: filtroIdEntidad ? Number(filtroIdEntidad) : undefined });
                    rawData = tipoPagoHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_TipoPago', headerName: 'ID Tipo Pago', width: 110, align: 'center', headerAlign: 'center' },
                        { field: 'nombre', headerName: 'Nombre Tipo Pago', width: 200 },
                        { field: 'detalle', headerName: 'Detalle', flex: 1, minWidth: 250, renderCell: (params) => (<Tooltip title={params.value || ''}><Typography noWrap variant="body2" sx={{ width: '100%' }}>{params.value || '-'}</Typography></Tooltip>) },
                    ];
                    break;
                case "Canillita":
                    const canMaestroHist = await auditoriaService.getHistorialCanillitasMaestro({ ...commonParams, idCanillaAfectado: filtroIdEntidad ? Number(filtroIdEntidad) : undefined });
                    rawData = canMaestroHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_Canilla', headerName: 'ID Canillita', width: 110, align: 'center', headerAlign: 'center' },
                        { field: 'nomApe', headerName: 'Nombre y Apellido', width: 200 },
                        { field: 'legajo', headerName: 'Legajo', width: 100, type: 'number' },
                        { field: 'parada', headerName: 'Parada', width: 180, renderCell: (params) => (<Tooltip title={params.value || ''}><Typography noWrap variant="body2">{params.value || '-'}</Typography></Tooltip>) },
                        { field: 'id_Zona', headerName: 'ID Zona', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'accionista', headerName: 'Accionista', width: 100, type: 'boolean' },
                        { field: 'empresa', headerName: 'ID Empresa', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'baja', headerName: 'Baja', width: 80, type: 'boolean' },
                        { field: 'fechaBaja', headerName: 'Fecha Baja', width: 120, type: 'date', valueFormatter: (value) => formatDate(value as string) },
                        { field: 'obs', headerName: 'Obs.', flex: 1, minWidth: 150, renderCell: (params) => (<Tooltip title={params.value || ''}><Typography noWrap variant="body2">{params.value || '-'}</Typography></Tooltip>) },
                    ];
                    break;
                case "Distribuidor":
                    const distMaestroHist = await auditoriaService.getHistorialDistribuidoresMaestro({ ...commonParams, idDistribuidorAfectado: filtroIdEntidad ? Number(filtroIdEntidad) : undefined });
                    rawData = distMaestroHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_Distribuidor', headerName: 'ID Distribuidor', width: 110, align: 'center', headerAlign: 'center' },
                        { field: 'nombre', headerName: 'Nombre', width: 200 },
                        { field: 'nroDoc', headerName: 'Nro. Doc.', width: 120 },
                        { field: 'contacto', headerName: 'Contacto', width: 150, renderCell: (params) => (<Tooltip title={params.value || ''}><Typography noWrap variant="body2">{params.value || '-'}</Typography></Tooltip>) },
                        { field: 'id_Zona', headerName: 'ID Zona', width: 90, align: 'center', headerAlign: 'center' },
                        { field: 'email', headerName: 'Email', width: 180, renderCell: (params) => (<Tooltip title={params.value || ''}><Typography noWrap variant="body2">{params.value || '-'}</Typography></Tooltip>) },
                        { field: 'telefono', headerName: 'Teléfono', width: 130 },
                    ];
                    break;
                case "Empresa":
                    const empMaestroHist = await auditoriaService.getHistorialEmpresasMaestro({ ...commonParams, idEmpresaAfectada: filtroIdEntidad ? Number(filtroIdEntidad) : undefined });
                    rawData = empMaestroHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_Empresa', headerName: 'ID Empresa', width: 110, align: 'center', headerAlign: 'center' },
                        { field: 'nombre', headerName: 'Nombre Empresa', width: 250 },
                        { field: 'detalle', headerName: 'Detalle', flex: 1, minWidth: 250, renderCell: (params) => (<Tooltip title={params.value || ''}><Typography noWrap variant="body2" sx={{ width: '100%' }}>{params.value || '-'}</Typography></Tooltip>) },
                    ];
                    break;
                case "Zona":
                    const zonaMaestroHist = await auditoriaService.getHistorialZonasMaestro({ ...commonParams, idZonaAfectada: filtroIdEntidad ? Number(filtroIdEntidad) : undefined });
                    rawData = zonaMaestroHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_Zona', headerName: 'ID Zona', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'nombre', headerName: 'Nombre Zona', width: 250 },
                        { field: 'descripcion', headerName: 'Descripción', flex: 1, minWidth: 250, renderCell: (params) => (<Tooltip title={params.value || ''}><Typography noWrap variant="body2" sx={{ width: '100%' }}>{params.value || '-'}</Typography></Tooltip>) },
                        { field: 'estado', headerName: 'Activa', width: 100, type: 'boolean' },
                    ];
                    break;
                case "OtroDestino":
                    const otroDestMaestroHist = await auditoriaService.getHistorialOtrosDestinosMaestro({ ...commonParams, idOtroDestinoAfectado: filtroIdEntidad ? Number(filtroIdEntidad) : undefined });
                    rawData = otroDestMaestroHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_Destino', headerName: 'ID Destino', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'nombre', headerName: 'Nombre Destino', width: 250 },
                        { field: 'obs', headerName: 'Observación', flex: 1, minWidth: 250, renderCell: (params) => (<Tooltip title={params.value || ''}><Typography noWrap variant="body2" sx={{ width: '100%' }}>{params.value || '-'}</Typography></Tooltip>) },
                    ];
                    break;
                case "Publicacion":
                    const pubMaestroHist = await auditoriaService.getHistorialPublicacionesMaestro({ ...commonParams, idPublicacionAfectada: filtroIdEntidad ? Number(filtroIdEntidad) : undefined });
                    rawData = pubMaestroHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_Publicacion', headerName: 'ID Pub.', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'nombre', headerName: 'Nombre Publicación', width: 220 },
                        { field: 'id_Empresa', headerName: 'ID Empresa', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'habilitada', headerName: 'Habilitada', width: 100, type: 'boolean' },
                        { field: 'observacion', headerName: 'Observación', flex: 1, minWidth: 200, renderCell: (params) => (<Tooltip title={params.value || ''}><Typography noWrap variant="body2" sx={{ width: '100%' }}>{params.value || '-'}</Typography></Tooltip>) },
                    ];
                    break;
                case "PubliSeccion":
                    const psMaestroHist = await auditoriaService.getHistorialPubliSeccionesMaestro({ ...commonParams, idSeccionAfectada: filtroIdEntidad ? Number(filtroIdEntidad) : undefined, idPublicacionAfectada: filtroIdPublicacionParaSeccion ? Number(filtroIdPublicacionParaSeccion) : undefined });
                    rawData = psMaestroHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_Seccion', headerName: 'ID Sección', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'id_Publicacion', headerName: 'ID Pub. (Hist)', width: 120, align: 'center', headerAlign: 'center' },
                        { field: 'nombre', headerName: 'Nombre Sección', width: 250 },
                        { field: 'estado', headerName: 'Activa', width: 100, type: 'boolean' },
                    ];
                    break;
                case "PrecioPublicacion":
                    const precioMaestroHist = await auditoriaService.getHistorialPreciosMaestro({ ...commonParams, idPrecioAfectado: filtroIdEntidad ? Number(filtroIdEntidad) : undefined, idPublicacionAfectada: filtroIdPublicacionParaSeccion ? Number(filtroIdPublicacionParaSeccion) : undefined });
                    rawData = precioMaestroHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_Precio', headerName: 'ID Precio', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'id_Publicacion', headerName: 'ID Pub.', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'vigenciaD', headerName: 'Vig. Desde', width: 120, type: 'date', valueFormatter: (value) => formatDate(value as string) },
                        { field: 'vigenciaH', headerName: 'Vig. Hasta', width: 120, type: 'date', valueFormatter: (value) => formatDate(value as string) },
                        { field: 'lunes', headerName: 'Lun', width: 90, type: 'number', valueFormatter: (v) => currencyFormatter(v as number) },
                        { field: 'martes', headerName: 'Mar', width: 90, type: 'number', valueFormatter: (v) => currencyFormatter(v as number) },
                        { field: 'miercoles', headerName: 'Mié', width: 90, type: 'number', valueFormatter: (v) => currencyFormatter(v as number) },
                        { field: 'jueves', headerName: 'Jue', width: 90, type: 'number', valueFormatter: (v) => currencyFormatter(v as number) },
                        { field: 'viernes', headerName: 'Vie', width: 90, type: 'number', valueFormatter: (v) => currencyFormatter(v as number) },
                        { field: 'sabado', headerName: 'Sáb', width: 90, type: 'number', valueFormatter: (v) => currencyFormatter(v as number) },
                        { field: 'domingo', headerName: 'Dom', width: 90, type: 'number', valueFormatter: (v) => currencyFormatter(v as number) },
                    ];
                    break;
                case "RecargoZona":
                    const rzMaestroHist = await auditoriaService.getHistorialRecargosZonaMaestro({ ...commonParams, idRecargoAfectado: filtroIdEntidad ? Number(filtroIdEntidad) : undefined, idPublicacionAfectada: filtroIdPublicacionParaSeccion ? Number(filtroIdPublicacionParaSeccion) : undefined, idZonaAfectada: filtroIdZonaParaRecargo ? Number(filtroIdZonaParaRecargo) : undefined });
                    rawData = rzMaestroHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_Recargo', headerName: 'ID Recargo', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'id_Publicacion', headerName: 'ID Pub.', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'id_Zona', headerName: 'ID Zona', width: 90, align: 'center', headerAlign: 'center' },
                        { field: 'vigenciaD', headerName: 'Vig. Desde', width: 120, type: 'date', valueFormatter: (value) => formatDate(value as string) },
                        { field: 'vigenciaH', headerName: 'Vig. Hasta', width: 120, type: 'date', valueFormatter: (value) => formatDate(value as string) },
                        { field: 'valor', headerName: 'Valor Recargo', width: 130, type: 'number', valueFormatter: (v) => currencyFormatter(v as number) },
                    ];
                    break;
                case "PorcPagoDistribuidor":
                    const ppdMaestroHist = await auditoriaService.getHistorialPorcPagoDistMaestro({ ...commonParams, idPorcentajeAfectado: filtroIdEntidad ? Number(filtroIdEntidad) : undefined, idPublicacionAfectada: filtroIdPublicacionParaSeccion ? Number(filtroIdPublicacionParaSeccion) : undefined, idDistribuidorAfectado: filtroIdDistribuidorParaPorc ? Number(filtroIdDistribuidorParaPorc) : undefined });
                    rawData = ppdMaestroHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_Porcentaje', headerName: 'ID Porc.', width: 90, align: 'center', headerAlign: 'center' },
                        { field: 'id_Publicacion', headerName: 'ID Pub.', width: 90, align: 'center', headerAlign: 'center' },
                        { field: 'id_Distribuidor', headerName: 'ID Dist.', width: 90, align: 'center', headerAlign: 'center' },
                        { field: 'vigenciaD', headerName: 'Vig. Desde', width: 120, type: 'date', valueFormatter: (value) => formatDate(value as string) },
                        { field: 'vigenciaH', headerName: 'Vig. Hasta', width: 120, type: 'date', valueFormatter: (value) => formatDate(value as string) },
                        { field: 'porcentaje', headerName: 'Porcentaje', width: 120, type: 'number', valueFormatter: (value) => value != null ? `${Number(value).toLocaleString('es-AR', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}%` : '-' },
                    ];
                    break;
                case "PorcMonCanilla":
                    const pmcMaestroHist = await auditoriaService.getHistorialPorcMonCanillaMaestro({ ...commonParams, idPorcMonAfectado: filtroIdEntidad ? Number(filtroIdEntidad) : undefined, idPublicacionAfectada: filtroIdPublicacionParaSeccion ? Number(filtroIdPublicacionParaSeccion) : undefined, idCanillaAfectada: filtroIdCanillitaParaPorcMon ? Number(filtroIdCanillitaParaPorcMon) : undefined });
                    rawData = pmcMaestroHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_PorcMon', headerName: 'ID Conf.', width: 90, align: 'center', headerAlign: 'center' },
                        { field: 'id_Publicacion', headerName: 'ID Pub.', width: 90, align: 'center', headerAlign: 'center' },
                        { field: 'id_Canilla', headerName: 'ID Can.', width: 90, align: 'center', headerAlign: 'center' },
                        { field: 'vigenciaD', headerName: 'Vig. Desde', width: 120, type: 'date', valueFormatter: (value) => formatDate(value as string) },
                        { field: 'vigenciaH', headerName: 'Vig. Hasta', width: 120, type: 'date', valueFormatter: (value) => formatDate(value as string) },
                        { field: 'porcMon', headerName: 'Valor', width: 100, type: 'number', valueFormatter: (value, row) => row.esPorcentaje ? `${Number(value).toLocaleString('es-AR', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}%` : currencyFormatter(value as number) },
                        { field: 'esPorcentaje', headerName: 'Es %', width: 80, type: 'boolean' },
                    ];
                    break;
                case "ControlDevoluciones":
                    const cdMaestroHist = await auditoriaService.getHistorialControlDevoluciones({ ...commonParams, idControlAfectado: filtroIdEntidad ? Number(filtroIdEntidad) : undefined, idEmpresaAfectada: filtroIdEmpresa ? Number(filtroIdEmpresa) : undefined, fechaAfectada: filtroFechaAfectadaParaCtrlDev || undefined });
                    rawData = cdMaestroHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_Control', headerName: 'ID Control', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'id_Empresa', headerName: 'ID Empresa', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'fecha', headerName: 'Fecha Control', width: 120, type: 'date', valueFormatter: (value) => formatDate(value as string) },
                        { field: 'entrada', headerName: 'Entrada', width: 100, type: 'number', valueFormatter: (v) => numberFormatter(v as number) },
                        { field: 'sobrantes', headerName: 'Sobrantes', width: 100, type: 'number', valueFormatter: (v) => numberFormatter(v as number) },
                        { field: 'sinCargo', headerName: 'Sin Cargo', width: 100, type: 'number', valueFormatter: (v) => numberFormatter(v as number) },
                        { field: 'detalle', headerName: 'Detalle', flex: 1, minWidth: 200, renderCell: (params) => (<Tooltip title={params.value || ''}><Typography noWrap variant="body2" sx={{ width: '100%' }}>{params.value || '-'}</Typography></Tooltip>) },
                    ];
                    break;
                case "TipoBobina":
                    const tbMaestroHist = await auditoriaService.getHistorialTiposBobinaMaestro({
                        ...commonParams,
                        idTipoBobinaAfectado: filtroIdEntidad ? Number(filtroIdEntidad) : undefined
                    });
                    rawData = tbMaestroHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_TipoBobina', headerName: 'ID Tipo Bobina', width: 120, align: 'center', headerAlign: 'center' },
                        { field: 'denominacion', headerName: 'Denominación', flex: 1, minWidth: 250 },
                    ];
                    break;
                case "EstadoBobina":
                    const ebMaestroHist = await auditoriaService.getHistorialEstadosBobinaMaestro({
                        ...commonParams,
                        idEstadoBobinaAfectado: filtroIdEntidad ? Number(filtroIdEntidad) : undefined
                    });
                    rawData = ebMaestroHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_EstadoBobina', headerName: 'ID Estado Bob.', width: 120, align: 'center', headerAlign: 'center' },
                        { field: 'denominacion', headerName: 'Denominación', width: 250 },
                        {
                            field: 'obs',
                            headerName: 'Observación',
                            flex: 1,
                            minWidth: 250,
                            renderCell: (params) => (<Tooltip title={params.value || ''}><Typography noWrap variant="body2" sx={{ width: '100%' }}>{params.value || '-'}</Typography></Tooltip>)
                        },
                    ];
                    break;
                case "PlantaImpresion":
                    const plantaMaestroHist = await auditoriaService.getHistorialPlantasMaestro({
                        ...commonParams,
                        idPlantaAfectada: filtroIdEntidad ? Number(filtroIdEntidad) : undefined
                    });
                    rawData = plantaMaestroHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_Planta', headerName: 'ID Planta', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'nombre', headerName: 'Nombre Planta', width: 250 },
                        {
                            field: 'detalle',
                            headerName: 'Detalle',
                            flex: 1,
                            minWidth: 250,
                            renderCell: (params) => (<Tooltip title={params.value || ''}><Typography noWrap variant="body2" sx={{ width: '100%' }}>{params.value || '-'}</Typography></Tooltip>)
                        },
                    ];
                    break;
                case "StockBobina":
                    const stockHist = await auditoriaService.getHistorialStockBobinas({
                        ...commonParams,
                        idBobinaAfectada: filtroIdEntidad ? Number(filtroIdEntidad) : undefined,
                        idTipoBobinaFiltro: filtroIdTipoBobina ? Number(filtroIdTipoBobina) : undefined,
                        idPlantaFiltro: filtroIdPlantaStock ? Number(filtroIdPlantaStock) : undefined,
                        idEstadoBobinaFiltro: filtroIdEstadoBobina ? Number(filtroIdEstadoBobina) : undefined,
                    });
                    rawData = stockHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_Bobina', headerName: 'ID Bobina', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'nroBobina', headerName: 'Nro Bobina', width: 120 },
                        { field: 'nombreTipoBobina', headerName: 'Tipo', width: 150 },
                        { field: 'peso', headerName: 'Peso (Kg)', width: 100, type: 'number', valueFormatter: (v) => numberFormatter(v as number) },
                        { field: 'nombrePlanta', headerName: 'Planta', width: 130 },
                        { field: 'nombreEstadoBobina', headerName: 'Estado', width: 130 },
                        { field: 'remito', headerName: 'Remito', width: 100 },
                        { field: 'fechaRemito', headerName: 'F. Remito', width: 110, type: 'date', valueFormatter: (v) => formatDate(v as string) },
                        { field: 'fechaEstado', headerName: 'F. Estado', width: 110, type: 'date', valueFormatter: (v) => formatDate(v as string) },
                        { field: 'nombrePublicacion', headerName: 'Publicación', width: 150 },
                        { field: 'nombreSeccion', headerName: 'Sección', width: 130 },
                        { field: 'obs', headerName: 'Obs.', flex: 1, minWidth: 150, renderCell: (p) => <Tooltip title={p.value || ''}><Typography noWrap variant="body2">{p.value || '-'}</Typography></Tooltip> },
                    ];
                    break;
                case "RegTirada":
                    const regTiradaHist = await auditoriaService.getHistorialRegTiradas({
                        ...commonParams,
                        idRegistroAfectado: filtroIdEntidad ? Number(filtroIdEntidad) : undefined,
                        idPublicacionFiltro: filtroIdPublicacionParaSeccion ? Number(filtroIdPublicacionParaSeccion) : undefined,
                        idPlantaFiltro: filtroIdPlantaTirada ? Number(filtroIdPlantaTirada) : undefined,
                        fechaTiradaFiltro: filtroFechaTirada || undefined,
                    });
                    rawData = regTiradaHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_Registro', headerName: 'ID Reg. Tirada', width: 120, align: 'center', headerAlign: 'center' },
                        { field: 'nombrePublicacion', headerName: 'Publicación', width: 200 },
                        { field: 'nombrePlanta', headerName: 'Planta', width: 150 },
                        { field: 'fecha', headerName: 'Fecha Tirada', width: 120, type: 'date', valueFormatter: (value) => formatDate(value as string) },
                        { field: 'ejemplares', headerName: 'Ejemplares', width: 120, type: 'number', valueFormatter: (v) => numberFormatter(v as number) },
                    ];
                    break;
                case "RegSeccionTirada":
                    const regSecHist = await auditoriaService.getHistorialRegSeccionesTirada({
                        ...commonParams,
                        idTiradaAfectada: filtroIdEntidad ? Number(filtroIdEntidad) : undefined,
                        idPublicacionFiltro: filtroIdPublicacionParaSeccion ? Number(filtroIdPublicacionParaSeccion) : undefined,
                        idSeccionFiltro: filtroIdSeccion ? Number(filtroIdSeccion) : undefined,
                        idPlantaFiltro: filtroIdPlantaTirada ? Number(filtroIdPlantaTirada) : undefined,
                        fechaTiradaFiltro: filtroFechaTirada || undefined,
                    });
                    rawData = regSecHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_Tirada', headerName: 'ID Reg. Sec.', width: 110, align: 'center', headerAlign: 'center' },
                        { field: 'nombrePublicacion', headerName: 'Publicación', width: 180 },
                        { field: 'nombreSeccion', headerName: 'Sección', width: 180 },
                        { field: 'nombrePlanta', headerName: 'Planta', width: 130 },
                        { field: 'fecha', headerName: 'Fecha Tirada', width: 120, type: 'date', valueFormatter: (value) => formatDate(value as string) },
                        { field: 'cantPag', headerName: 'Págs.', width: 90, type: 'number', valueFormatter: (v) => numberFormatter(v as number) },
                    ];
                    break;
                case "PerfilMaestro":
                    const perfilHist = await auditoriaService.getHistorialPerfilesMaestro({
                        ...commonParams,
                        idPerfilAfectado: filtroIdEntidad ? Number(filtroIdEntidad) : undefined
                    });
                    rawData = perfilHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'idPerfil', headerName: 'ID Perfil', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'perfil', headerName: 'Nombre Perfil', width: 200 },
                        {
                            field: 'descPerfil',
                            headerName: 'Descripción',
                            flex: 1,
                            minWidth: 250,
                            renderCell: (params) => (<Tooltip title={params.value || ''}><Typography noWrap variant="body2" sx={{ width: '100%' }}>{params.value || '-'}</Typography></Tooltip>)
                        },
                    ];
                    break;
                case "PermisoMaestro":
                    const permisoHist = await auditoriaService.getHistorialPermisosMaestro({
                        ...commonParams,
                        idPermisoAfectado: filtroIdEntidad ? Number(filtroIdEntidad) : undefined
                    });
                    rawData = permisoHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'idPermiso', headerName: 'ID Permiso', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'codAcc', headerName: 'Cod. Acceso', width: 120 },
                        { field: 'descPermiso', headerName: 'Descripción', flex: 1, minWidth: 250 },
                        { field: 'modulo', headerName: 'Módulo', width: 200 },
                    ];
                    break;
                case "PermisosPerfiles":
                    const ppHist = await auditoriaService.getHistorialPermisosPerfiles({
                        ...commonParams,
                        idPerfilAfectado: filtroIdPerfil ? Number(filtroIdPerfil) : undefined,
                        idPermisoAfectado: filtroIdPermiso ? Number(filtroIdPermiso) : undefined,
                    });
                    rawData = ppHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'nombrePerfil', headerName: 'Perfil Afectado', width: 180 },
                        { field: 'codAccPermiso', headerName: 'Cod. Permiso', width: 120 },
                        { field: 'descPermiso', headerName: 'Descripción Permiso', flex: 1, minWidth: 250 },
                    ];
                    break;
                case "CambioParada":
                    const paradaHist = await auditoriaService.getHistorialCambiosParada({
                        ...commonParams,
                        // "ID Entidad Afectada" aquí se puede usar para filtrar por canillita
                        idCanillaAfectado: filtroIdEntidad ? Number(filtroIdEntidad) : undefined
                    });
                    rawData = paradaHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_Registro', headerName: 'ID Reg.', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'nombreCanilla', headerName: 'Canillita', width: 200 },
                        { field: 'parada', headerName: 'Parada', flex: 1, minWidth: 250 },
                        { field: 'vigenciaD', headerName: 'Vig. Desde', width: 120, type: 'date', valueFormatter: (value) => formatDate(value as string) },
                        { field: 'vigenciaH', headerName: 'Vig. Hasta', width: 120, type: 'date', valueFormatter: (value) => formatDate(value as string) },
                    ];
                    break;
                case "CierreCC":
                    const cierreCcHist = await auditoriaService.getHistorialCierresCC({
                        ...commonParams,
                        // "ID Entidad Afectada" filtra por Id_Cierre puntual.
                        idCierreAfectado: filtroIdEntidad ? Number(filtroIdEntidad) : undefined
                    });
                    rawData = cierreCcHist;
                    cols = [
                        ...getCommonAuditColumns(),
                        { field: 'id_Cierre', headerName: 'ID Cierre', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'id_Distribuidor', headerName: 'ID Dist.', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'id_Empresa', headerName: 'ID Emp.', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'fechaCorte', headerName: 'Fecha Corte', width: 120, type: 'date', valueFormatter: (value) => formatDate(value as string) },
                        { field: 'fechaCierre', headerName: 'Fecha Cierre', width: 170, valueFormatter: (value) => formatDate(value as string) },
                        { field: 'saldoCierre', headerName: 'Saldo Cierre', width: 140, type: 'number', valueFormatter: (v) => currencyFormatter(v as number) },
                        { field: 'estado', headerName: 'Estado', width: 100 },
                        { field: 'justificacion', headerName: 'Justif. Cierre', width: 200, renderCell: (params) => (<Tooltip title={params.value || ''}><Typography noWrap variant="body2">{params.value || '-'}</Typography></Tooltip>) },
                        { field: 'id_Usuario_Cierre', headerName: 'Usr. Cierre', width: 100, align: 'center', headerAlign: 'center' },
                        { field: 'id_Usuario_Anula', headerName: 'Usr. Anula', width: 100, align: 'center', headerAlign: 'center', renderCell: (p) => p.value ?? '-' },
                        { field: 'fechaAnulacion', headerName: 'Fecha Anul.', width: 170, valueFormatter: (v) => v ? formatDate(v as string) : '-' },
                        { field: 'justificacion_Anulacion', headerName: 'Justif. Anul.', flex: 1, minWidth: 200, renderCell: (params) => (<Tooltip title={params.value || ''}><Typography noWrap variant="body2">{params.value || '-'}</Typography></Tooltip>) },
                    ];
                    break;
                default:
                    setError(`La vista de auditoría para '${filtroTipoEntidad}' aún no está implementada.`);
                    setDatosAuditoria([]);
                    setColumnasActuales(getCommonAuditColumns());
                    setLoading(false);
                    return;
            }
            setDatosAuditoria(rawData.map((item, index) => {
                const idKey = Object.keys(item).find(k => k.toLowerCase().startsWith('id_') || k.toLowerCase().startsWith('idhist') || k.toLowerCase() === 'id');
                const idValue = idKey ? item[idKey] : `fallback-${index}`;
                return { ...item, id: `${filtroTipoEntidad}-${idValue}-${index}-${Math.random().toString(36).substring(2)}` };
            }));
            setColumnasActuales(cols);

        } catch (err: any) {
            console.error("Error en cargarHistorial:", err);
            setError(err.response?.data?.message || 'Error al cargar el historial.');
            setDatosAuditoria([]);
            setColumnasActuales(getCommonAuditColumns());
        } finally {
            setLoading(false);
        }
    }, [
        puedeVerAuditoria, filtroTipoEntidad, filtroFechaDesde, filtroFechaHasta,
        filtroIdUsuarioMod, filtroIdEntidad, filtroTipoMod,
        filtroIdPublicacionParaSeccion, filtroIdZonaParaRecargo, filtroIdDistribuidorParaPorc,
        filtroIdCanillitaParaPorcMon, filtroIdEmpresa, filtroFechaAfectadaParaCtrlDev,
        filtroIdTipoBobina, filtroIdPlantaStock, filtroIdEstadoBobina, filtroIdPlantaTirada,
        filtroFechaTirada, filtroIdSeccion
    ]);

    const handleBuscar = () => {
        setPage(0);
        cargarHistorial();
    }

    if (!puedeVerAuditoria && !loadingDropdowns) {
        return <Box sx={{ p: 2 }}><Alert severity="error">No tiene permiso para acceder a la Auditoría General.</Alert></Box>;
    }
    if (loadingDropdowns && !usuariosDropdown.length) { // Un chequeo más específico para el spinner inicial
        return <Box sx={{ display: 'flex', justifyContent: 'center', p: 3 }}><CircularProgress /></Box>;
    }

    return (
        <Box sx={{ p: 1 }}>
            <Typography variant="h5" gutterBottom>Auditoría General del Sistema</Typography>
            <Paper sx={{ p: 2, mb: 2 }}>
                <Typography variant="h6" gutterBottom>Filtros <FilterListIcon fontSize="small" /></Typography>
                <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 2, alignItems: 'center', mb: 2 }}>
                    <TextField label="Fecha Mod. Desde" type="date" size="small" value={filtroFechaDesde} onChange={(e) => setFiltroFechaDesde(e.target.value)} InputLabelProps={{ shrink: true }} sx={{ minWidth: 170 }} />
                    <TextField label="Fecha Mod. Hasta" type="date" size="small" value={filtroFechaHasta} onChange={(e) => setFiltroFechaHasta(e.target.value)} InputLabelProps={{ shrink: true }} sx={{ minWidth: 170 }} />
                    <FormControl size="small" sx={{ minWidth: 200, flexGrow: 1 }} disabled={loadingDropdowns}>
                        <InputLabel>Modificado Por</InputLabel>
                        <Select value={filtroIdUsuarioMod} label="Modificado Por" onChange={(e) => setFiltroIdUsuarioMod(e.target.value)}>
                            <MenuItem value=""><em>Todos</em></MenuItem>
                            {usuariosDropdown.map((u) => (<MenuItem key={u.id} value={u.id}>{u.nombre} {u.apellido} ({u.user})</MenuItem>))}
                        </Select>
                    </FormControl>
                    <FormControl size="small" sx={{ minWidth: 220, flexGrow: 1 }} required error={!filtroTipoEntidad && !!error && error.includes("Debe seleccionar un 'Tipo de Entidad")}>
                        <InputLabel>Tipo de Entidad a Auditar</InputLabel>
                        <Select value={filtroTipoEntidad} label="Tipo de Entidad a Auditar"
                            onChange={(e) => {
                                setFiltroTipoEntidad(e.target.value);
                                setFiltroIdEntidad('');
                                setFiltroIdPublicacionParaSeccion('');
                                setFiltroIdZonaParaRecargo('');
                                setFiltroIdDistribuidorParaPorc('');
                                setFiltroIdCanillitaParaPorcMon('');
                                setFiltroIdEmpresa('');
                                setFiltroFechaAfectadaParaCtrlDev('');
                                setFiltroIdTipoBobina('');
                                setFiltroIdPlantaStock('');
                                setFiltroIdEstadoBobina('');
                                setDatosAuditoria([]);
                                setColumnasActuales(getCommonAuditColumns());
                                if (error && error.includes("Debe seleccionar un 'Tipo de Entidad")) setError(null);
                            }}
                        >
                            <MenuItem value=""><em>Seleccione un tipo</em></MenuItem>
                            {TIPOS_ENTIDAD_AUDITABLES.map((t) => (<MenuItem key={t.value} value={t.value}>{t.label}</MenuItem>))}
                        </Select>
                        {!filtroTipoEntidad && error && error.includes("Debe seleccionar un 'Tipo de Entidad") && <Typography color="error" variant="caption" sx={{ ml: 1.5, mt: 0.5 }}>{error}</Typography>}
                    </FormControl>
                    <TextField label="ID Entidad Afectada" type="number" size="small" value={filtroIdEntidad}
                        onChange={(e) => setFiltroIdEntidad(e.target.value)} sx={{ minWidth: 150 }}
                        InputProps={{ inputProps: { min: 1 } }}
                        disabled={!filtroTipoEntidad}
                    />
                    <FormControl size="small" sx={{ minWidth: 180, flexGrow: 1 }}>
                        <InputLabel>Tipo Modificación</InputLabel>
                        <Select value={filtroTipoMod} label="Tipo Modificación" onChange={(e) => setFiltroTipoMod(e.target.value)}>
                            <MenuItem value=""><em>Todas</em></MenuItem>
                            {TIPOS_MODIFICACION.map((t) => (<MenuItem key={t} value={t}>{t}</MenuItem>))}
                        </Select>
                    </FormControl>

                    {/* Filtros condicionales */}
                    {(filtroTipoEntidad === "ControlDevoluciones" || filtroTipoEntidad === "SaldoAjuste") && (
                        <FormControl size="small" sx={{ minWidth: 200, flexGrow: 1 }} disabled={loadingDropdowns}>
                            <InputLabel>Empresa</InputLabel>
                            <Select value={filtroIdEmpresa} label="Empresa"
                                onChange={(e) => setFiltroIdEmpresa(e.target.value)}>
                                <MenuItem value=""><em>Todas</em></MenuItem>
                                {empresasDropdown.map((e) => (<MenuItem key={e.idEmpresa} value={e.idEmpresa}>{e.nombre}</MenuItem>))}
                            </Select>
                        </FormControl>
                    )}
                    {filtroTipoEntidad === "ControlDevoluciones" && (
                        <TextField
                            label="Fecha Control (Filtro Opc.)"
                            type="date"
                            size="small"
                            value={filtroFechaAfectadaParaCtrlDev}
                            onChange={(e) => setFiltroFechaAfectadaParaCtrlDev(e.target.value)}
                            InputLabelProps={{ shrink: true }}
                            sx={{ minWidth: 170 }}
                            disabled={loading}
                        />
                    )}
                    {(filtroTipoEntidad === "PubliSeccion" || filtroTipoEntidad === "PrecioPublicacion" || filtroTipoEntidad === "RecargoZona" || filtroTipoEntidad === "PorcPagoDistribuidor" || filtroTipoEntidad === "PorcMonCanilla") && (
                        <FormControl size="small" sx={{ minWidth: 200, flexGrow: 1 }} disabled={loadingDropdowns}>
                            <InputLabel>Publicación (Filtro Opc.)</InputLabel>
                            <Select value={filtroIdPublicacionParaSeccion} label="Publicación (Filtro Opc.)"
                                onChange={(e) => setFiltroIdPublicacionParaSeccion(e.target.value)}>
                                <MenuItem value=""><em>Todas</em></MenuItem>
                                {publicacionesDropdown.map((p) => (<MenuItem key={p.idPublicacion} value={p.idPublicacion}>{p.nombre}</MenuItem>))}
                            </Select>
                        </FormControl>
                    )}
                    {(filtroTipoEntidad === "RecargoZona") && (
                        <FormControl size="small" sx={{ minWidth: 200, flexGrow: 1 }} disabled={loadingDropdowns}>
                            <InputLabel>Zona (Filtro Opc.)</InputLabel>
                            <Select value={filtroIdZonaParaRecargo} label="Zona (Filtro Opc.)"
                                onChange={(e) => setFiltroIdZonaParaRecargo(e.target.value)}>
                                <MenuItem value=""><em>Todas</em></MenuItem>
                                {zonasDropdown.map((z) => (<MenuItem key={z.idZona} value={z.idZona}>{z.nombre}</MenuItem>))}
                            </Select>
                        </FormControl>
                    )}
                    {(filtroTipoEntidad === "PorcPagoDistribuidor") && (
                        <FormControl size="small" sx={{ minWidth: 220, flexGrow: 1 }} disabled={loadingDropdowns}>
                            <InputLabel>Distribuidor (Filtro Opc.)</InputLabel>
                            <Select value={filtroIdDistribuidorParaPorc} label="Distribuidor (Filtro Opc.)"
                                onChange={(e) => setFiltroIdDistribuidorParaPorc(e.target.value)}>
                                <MenuItem value=""><em>Todos</em></MenuItem>
                                {distribuidoresDropdown.map((d) => (<MenuItem key={d.idDistribuidor} value={d.idDistribuidor}>{d.nombre}</MenuItem>))}
                            </Select>
                        </FormControl>
                    )}
                    {(filtroTipoEntidad === "PorcMonCanilla") && (
                        <FormControl size="small" sx={{ minWidth: 220, flexGrow: 1 }} disabled={loadingDropdowns}>
                            <InputLabel>Canillita/Accionista (Filtro Opc.)</InputLabel>
                            <Select value={filtroIdCanillitaParaPorcMon} label="Canillita/Accionista (Filtro Opc.)"
                                onChange={(e) => setFiltroIdCanillitaParaPorcMon(e.target.value)}>
                                <MenuItem value=""><em>Todos</em></MenuItem>
                                {canillitasDropdown.map((c) => (<MenuItem key={c.idCanilla} value={c.idCanilla}>{c.nomApe} {c.legajo ? `(Leg: ${c.legajo})` : ''}</MenuItem>))}
                            </Select>
                        </FormControl>
                    )}
                    {filtroTipoEntidad === "StockBobina" && (
                        <>
                            <FormControl size="small" sx={{ minWidth: 180, flexGrow: 1 }} disabled={loadingDropdowns}>
                                <InputLabel>Tipo Bobina</InputLabel>
                                <Select value={filtroIdTipoBobina} label="Tipo Bobina" onChange={(e) => setFiltroIdTipoBobina(e.target.value)}>
                                    <MenuItem value=""><em>Todos</em></MenuItem>
                                    {tiposBobinaDropdown.map((t) => (<MenuItem key={t.idTipoBobina} value={t.idTipoBobina}>{t.denominacion}</MenuItem>))}
                                </Select>
                            </FormControl>
                            <FormControl size="small" sx={{ minWidth: 180, flexGrow: 1 }} disabled={loadingDropdowns}>
                                <InputLabel>Planta</InputLabel>
                                <Select value={filtroIdPlantaStock} label="Planta" onChange={(e) => setFiltroIdPlantaStock(e.target.value)}>
                                    <MenuItem value=""><em>Todas</em></MenuItem>
                                    {plantasStockDropdown.map((p) => (<MenuItem key={p.idPlanta} value={p.idPlanta}>{p.nombre}</MenuItem>))}
                                </Select>
                            </FormControl>
                            <FormControl size="small" sx={{ minWidth: 180, flexGrow: 1 }} disabled={loadingDropdowns}>
                                <InputLabel>Estado Bobina</InputLabel>
                                <Select value={filtroIdEstadoBobina} label="Estado Bobina" onChange={(e) => setFiltroIdEstadoBobina(e.target.value)}>
                                    <MenuItem value=""><em>Todos</em></MenuItem>
                                    {estadosBobinaDropdown.map((e) => (<MenuItem key={e.idEstadoBobina} value={e.idEstadoBobina}>{e.denominacion}</MenuItem>))}
                                </Select>
                            </FormControl>
                        </>
                    )}
                    {filtroTipoEntidad === "RegTirada" && (
                        <>
                            {/* Select de Publicación (reutiliza filtroIdPublicacionParaSeccion) */}
                            <FormControl size="small" sx={{ minWidth: 200, flexGrow: 1 }} disabled={loadingDropdowns}>
                                <InputLabel>Publicación (Filtro)</InputLabel>
                                <Select value={filtroIdPublicacionParaSeccion} label="Publicación (Filtro)"
                                    onChange={(e) => setFiltroIdPublicacionParaSeccion(e.target.value)}>
                                    <MenuItem value=""><em>Todas</em></MenuItem>
                                    {publicacionesDropdown.map((p) => (<MenuItem key={p.idPublicacion} value={p.idPublicacion}>{p.nombre}</MenuItem>))}
                                </Select>
                            </FormControl>
                            <FormControl size="small" sx={{ minWidth: 180, flexGrow: 1 }} disabled={loadingDropdowns}>
                                <InputLabel>Planta (Filtro)</InputLabel>
                                <Select value={filtroIdPlantaTirada} label="Planta (Filtro)" onChange={(e) => setFiltroIdPlantaTirada(e.target.value)}>
                                    <MenuItem value=""><em>Todas</em></MenuItem>
                                    {plantasStockDropdown.map((p) => (<MenuItem key={p.idPlanta} value={p.idPlanta}>{p.nombre}</MenuItem>))}
                                </Select>
                            </FormControl>
                            <TextField label="Fecha Tirada (Filtro)" type="date" size="small" value={filtroFechaTirada}
                                onChange={(e) => setFiltroFechaTirada(e.target.value)} InputLabelProps={{ shrink: true }}
                                sx={{ minWidth: 170 }}
                                disabled={loading}
                            />
                        </>
                    )}
                    {filtroTipoEntidad === "RegSeccionTirada" && (
                        <>
                            <FormControl size="small" sx={{ minWidth: 200, flexGrow: 1 }} disabled={loadingDropdowns}>
                                <InputLabel>Publicación (Filtro)</InputLabel>
                                <Select value={filtroIdPublicacionParaSeccion} label="Publicación (Filtro)"
                                    onChange={(e) => setFiltroIdPublicacionParaSeccion(e.target.value)}>
                                    <MenuItem value=""><em>Todas</em></MenuItem>
                                    {publicacionesDropdown.map((p) => (<MenuItem key={p.idPublicacion} value={p.idPublicacion}>{p.nombre}</MenuItem>))}
                                </Select>
                            </FormControl>
                            <FormControl size="small" sx={{ minWidth: 180, flexGrow: 1 }} disabled={loadingDropdowns}>
                                <InputLabel>Planta (Filtro)</InputLabel>
                                <Select value={filtroIdPlantaTirada} label="Planta (Filtro)" onChange={(e) => setFiltroIdPlantaTirada(e.target.value)}>
                                    <MenuItem value=""><em>Todas</em></MenuItem>
                                    {plantasStockDropdown.map((p) => (<MenuItem key={p.idPlanta} value={p.idPlanta}>{p.nombre}</MenuItem>))}
                                </Select>
                            </FormControl>
                            <TextField label="Fecha Tirada (Filtro)" type="date" size="small" value={filtroFechaTirada}
                                onChange={(e) => setFiltroFechaTirada(e.target.value)} InputLabelProps={{ shrink: true }}
                                sx={{ minWidth: 170 }}
                                disabled={loading}
                            />
                            <FormControl size="small" sx={{ minWidth: 200, flexGrow: 1 }} disabled={loadingDropdowns || !filtroIdPublicacionParaSeccion}>
                                <InputLabel>Sección (Filtro)</InputLabel>
                                <Select value={filtroIdSeccion} label="Sección (Filtro)"
                                    onChange={(e) => setFiltroIdSeccion(e.target.value)}>
                                    <MenuItem value=""><em>Todas</em></MenuItem>
                                    {seccionesDropdown.map((s) => (<MenuItem key={s.idSeccion} value={s.idSeccion}>{s.nombre}</MenuItem>))}
                                </Select>
                            </FormControl>
                        </>
                    )}
                    {(filtroTipoEntidad === "PermisosPerfiles") && (
                        <>
                            <FormControl size="small" sx={{ minWidth: 200, flexGrow: 1 }} disabled={loadingDropdowns}>
                                <InputLabel>Perfil (Filtro)</InputLabel>
                                <Select value={filtroIdPerfil} label="Perfil (Filtro)" onChange={(e) => setFiltroIdPerfil(e.target.value)}>
                                    <MenuItem value=""><em>Todos</em></MenuItem>
                                    {perfilesDropdown.map((p) => (<MenuItem key={p.id} value={p.id}>{p.nombrePerfil}</MenuItem>))}
                                </Select>
                            </FormControl>
                            <FormControl size="small" sx={{ minWidth: 200, flexGrow: 1 }} disabled={loadingDropdowns}>
                                <InputLabel>Permiso (Filtro)</InputLabel>
                                <Select value={filtroIdPermiso} label="Permiso (Filtro)" onChange={(e) => setFiltroIdPermiso(e.target.value)}>
                                    <MenuItem value=""><em>Todos</em></MenuItem>
                                    {permisosDropdown.map((p) => (<MenuItem key={p.id} value={p.id}>{p.codAcc} - {p.descPermiso}</MenuItem>))}
                                </Select>
                            </FormControl>
                        </>
                    )}
                    <Button variant="contained" onClick={handleBuscar} disabled={loading || loadingDropdowns || !filtroTipoEntidad}>
                        {loading ? <CircularProgress size={24} color="inherit" /> : "Buscar"}
                    </Button>
                </Box>
            </Paper>

            {/* Mostrar error general si no es un error de "seleccione tipo de entidad" */}
            {error && !error.includes("Debe seleccionar un 'Tipo de Entidad") && !loading && <Alert severity="error" sx={{ my: 2 }}>{error}</Alert>}

            {!loading && !error && filtroTipoEntidad && (
                <Paper sx={{ height: 'calc(100vh - 420px)', width: '100%' }}> {/* Ajustar altura */}
                    <DataGrid
                        rows={datosAuditoria}
                        columns={columnasActuales}
                        localeText={esES.components.MuiDataGrid.defaultProps.localeText}
                        density="compact"
                        // rowCount={datosAuditoria.length} // Quitar si la paginación es del lado del cliente
                        paginationModel={{ page, pageSize: rowsPerPage }}
                        onPaginationModelChange={(model) => {
                            setPage(model.page);
                            setRowsPerPage(model.pageSize);
                        }}
                        pageSizeOptions={[25, 50, 100]}
                        rowHeight={40} // Reducir un poco la altura de fila para más datos
                        sx={{
                            '& .MuiDataGrid-cell': { whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' },
                            '& .MuiDataGrid-columnHeaderTitleContainer': { overflow: 'hidden' },
                        }}
                        getRowId={(row) => row.id}
                    />
                </Paper>
            )}
            {!loading && !error && datosAuditoria.length === 0 && filtroTipoEntidad && (
                <Typography sx={{ mt: 2, fontStyle: 'italic', textAlign: 'center' }}>
                    No se encontraron registros de auditoría para '{TIPOS_ENTIDAD_AUDITABLES.find(t => t.value === filtroTipoEntidad)?.label || filtroTipoEntidad}' con los filtros aplicados.
                </Typography>
            )}
            {!loading && !error && !filtroTipoEntidad && (
                <Typography sx={{ mt: 2, fontStyle: 'italic', textAlign: 'center' }}>
                    Seleccione un "Tipo de Entidad a Auditar" y presione "Buscar".
                </Typography>
            )}
        </Box>
    );
};

export default AuditoriaGeneralPage;