<?php
/**
 * ASISMA CRM - Helper de Auditoría
 */
class AuditHelper {

    public static function log($accion, $entidad, $entidadId = null, $datosAntes = null, $datosDespues = null) {
        try {
            $db = Database::getInstance();

            if (isset($_SERVER['HTTP_CLIENT_IP']) && !empty($_SERVER['HTTP_CLIENT_IP'])) {
                $ip = $_SERVER['HTTP_CLIENT_IP'];
            } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
                $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
            } elseif (isset($_SERVER['REMOTE_ADDR'])) {
                $ip = $_SERVER['REMOTE_ADDR'];
            } else {
                $ip = '127.0.0.1';
            }

            $jsonAntes    = !empty($datosAntes)    ? json_encode($datosAntes,    JSON_UNESCAPED_UNICODE) : null;
            $jsonDespues  = !empty($datosDespues)  ? json_encode($datosDespues,  JSON_UNESCAPED_UNICODE) : null;

            $data = array(
                'usuario_id'      => SessionHelper::getUsuarioId(),
                'franquiciado_id' => SessionHelper::getFranquiciadoId(),
                'accion'          => $accion,
                'entidad'         => $entidad,
                'entidad_id'      => $entidadId,
                'datos_antes'     => $jsonAntes,
                'datos_despues'   => $jsonDespues,
                'ip'              => substr($ip, 0, 45)
            );

            return $db->insert('audit_log', $data);
        } catch (Exception $e) {
            error_log("Error al escribir en bitácora de auditoría: " . $e->getMessage());
            return false;
        }
    }

    /**
     * Registra automáticamente CADA petición autenticada (navegación y envíos
     * de formularios). Lo llama el Router antes de ejecutar la acción, para
     * que todos los movimientos de los usuarios queden en la bitácora.
     */
    public static function registrarMovimiento($ruta) {
        // Rutas de sondeo automático: se disparan solas cada pocos segundos
        // y solo meterían ruido en la bitácora.
        $rutasRuido = array('whatsapp/chat');
        if (in_array($ruta, $rutasRuido)) return;
        if (!SessionHelper::getUsuarioId()) return;

        $metodo  = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET';
        $detalle = array('metodo' => $metodo, 'ruta' => $ruta);
        if (!empty($_GET)) {
            $detalle['parametros'] = self::filtrarDatosSensibles($_GET);
        }
        if ($metodo !== 'GET' && !empty($_POST)) {
            $detalle['datos'] = self::filtrarDatosSensibles($_POST);
        }

        self::log($metodo === 'GET' ? 'navegacion' : 'envio_datos', 'http:' . substr($ruta, 0, 44), null, null, $detalle);
    }

    /** Enmascara credenciales y recorta valores largos antes de guardarlos. */
    private static function filtrarDatosSensibles($datos) {
        $ocultar = array('password', 'password_actual', 'password_nueva', 'password_confirmacion', 'password_hash', 'api_key');
        $limpio = array();
        foreach ($datos as $clave => $valor) {
            if (in_array(strtolower($clave), $ocultar)) {
                $limpio[$clave] = '******';
                continue;
            }
            if (is_array($valor)) {
                $valor = json_encode($valor, JSON_UNESCAPED_UNICODE);
            }
            $limpio[$clave] = function_exists('mb_substr') ? mb_substr((string)$valor, 0, 300) : substr((string)$valor, 0, 300);
        }
        return $limpio;
    }
}
