<?php
/**
 * ASISMA CRM - Auditoría Controller
 * Bitácora completa de movimientos: solo el admin de la matriz.
 */
class AuditoriaController extends Controller {

    public function index() {
        $db = Database::getInstance();

        $pagina = (int)$this->input('page', 1);
        if ($pagina < 1) $pagina = 1;
        $porPagina = 50;

        $filtros = array(
            'usuario_id'      => (int)$this->input('usuario_id', 0),
            'franquiciado_id' => (int)$this->input('franquiciado_id', 0),
            'accion'          => trim($this->input('accion', '')),
            'q'               => trim($this->input('q', '')),
            'desde'           => trim($this->input('desde', '')),
            'hasta'           => trim($this->input('hasta', ''))
        );

        $where  = array('1=1');
        $params = array();
        if ($filtros['usuario_id']) {
            $where[] = 'a.usuario_id = :uid';
            $params['uid'] = $filtros['usuario_id'];
        }
        if ($filtros['franquiciado_id']) {
            $where[] = 'a.franquiciado_id = :fid';
            $params['fid'] = $filtros['franquiciado_id'];
        }
        if ($filtros['accion'] !== '') {
            $where[] = 'a.accion = :accion';
            $params['accion'] = $filtros['accion'];
        }
        if ($filtros['q'] !== '') {
            $comodin = '%' . $filtros['q'] . '%';
            $where[] = "(a.entidad LIKE :q1 OR COALESCE(a.datos_antes,'') LIKE :q2 OR COALESCE(a.datos_despues,'') LIKE :q3 OR COALESCE(a.ip,'') LIKE :q4)";
            $params['q1'] = $comodin; $params['q2'] = $comodin; $params['q3'] = $comodin; $params['q4'] = $comodin;
        }
        if ($filtros['desde'] !== '') {
            $where[] = 'a.created_at >= :desde';
            $params['desde'] = $filtros['desde'] . ' 00:00:00';
        }
        if ($filtros['hasta'] !== '') {
            $where[] = 'a.created_at <= :hasta';
            $params['hasta'] = $filtros['hasta'] . ' 23:59:59';
        }
        $whereSql = implode(' AND ', $where);

        $totalFila = $db->fetchOne("SELECT COUNT(*) total FROM audit_log a WHERE {$whereSql}", $params);
        $total = (int)$totalFila['total'];
        $totalPaginas = max(1, (int)ceil($total / $porPagina));
        if ($pagina > $totalPaginas) $pagina = $totalPaginas;
        $offset = ($pagina - 1) * $porPagina;

        $logs = $db->fetchAll(
            "SELECT a.*, u.nombre as usuario_nombre, u.email as usuario_email, u.rol as usuario_rol,
                    ef.nombre_fantasia as franquiciado_nombre
             FROM audit_log a
             LEFT JOIN usuarios u ON a.usuario_id = u.id
             LEFT JOIN franquiciados f ON a.franquiciado_id = f.id
             LEFT JOIN empresas_franquiciados ef ON f.empresa_madre_id = ef.id
             WHERE {$whereSql}
             ORDER BY a.id DESC
             LIMIT {$porPagina} OFFSET {$offset}",
            $params
        );

        // Catálogos para los selects de filtro
        $usuarios = $db->fetchAll(
            "SELECT DISTINCT u.id, u.nombre, u.email FROM audit_log a
             INNER JOIN usuarios u ON a.usuario_id = u.id ORDER BY u.nombre ASC"
        );
        $acciones = $db->fetchAll("SELECT DISTINCT accion FROM audit_log ORDER BY accion ASC");
        $franquiciados = $db->fetchAll(
            "SELECT f.id, ef.nombre_fantasia FROM franquiciados f
             INNER JOIN empresas_franquiciados ef ON f.empresa_madre_id = ef.id
             ORDER BY ef.nombre_fantasia ASC"
        );

        $this->render('auditoria/index', array(
            'title'         => 'Bitácora de Auditoría del Sistema',
            'logs'          => $logs,
            'filtros'       => $filtros,
            'usuarios'      => $usuarios,
            'acciones'      => $acciones,
            'franquiciados' => $franquiciados,
            'total'         => $total,
            'pagina'        => $pagina,
            'totalPaginas'  => $totalPaginas
        ));
    }
}
