<?php
/**
 * ARCHIVO: api_logic/admin.php
 * DESCRIPCIÓN: Gestión de seguridad, usuarios y mantenimiento de base de datos.
 */

// --- GESTIÓN DE USUARIOS Y PERMISOS ---
if ($task == 'get_users') {
    $res = $conn->query("SELECT id_empleado, nombre, usuario, rol, estado FROM empleados ORDER BY nombre ASC");
    $users = [];
    while ($res && $r = $res->fetch_assoc()) { $users[] = $r; }
    echo json_encode($users);
    exit;
}

if ($task == 'toggle_user') {
    $id = (int)$_POST['id'];
    $est = (int)$_POST['estado'];
    $conn->query("UPDATE empleados SET estado = $est WHERE id_empleado = $id");
    echo json_encode(['success' => true]);
    exit;
}

if ($task == 'get_permisos') {
    $id = (int)$_GET['id'];
    $res = $conn->query("SELECT permisos FROM empleados WHERE id_empleado = $id");
    echo json_encode($res->fetch_assoc());
    exit;
}

if ($task == 'save_permisos') {
    $id = (int)$_POST['id_user'];
    $perm = $conn->real_escape_string($_POST['permisos']);
    $conn->query("UPDATE empleados SET permisos = '$perm' WHERE id_empleado = $id");
    echo json_encode(['success' => true]);
    exit;
}

// --- SEGURIDAD ---
if ($task == 'admin_reset_pass') {
    $id = (int)$_POST['id_user'];
    $hash = password_hash($_POST['password'], PASSWORD_DEFAULT);
    $conn->query("UPDATE empleados SET password = '$hash' WHERE id_empleado = $id");
    echo json_encode(['success' => true]);
    exit;
}

// --- MOTOR DE RESPALDO (BACKUP) ---
if ($task == 'backup_db') {
    $filename = "backup_guzman_" . date("Y-m-d_H-i-s") . ".sql";
    header('Content-Type: application/octet-stream');
    header("Content-disposition: attachment; filename=\"" . $filename . "\"");
    
    $tables = [];
    $resT = $conn->query('SHOW TABLES');
    while($row = $resT->fetch_row()) { $tables[] = $row[0]; }
    
    $out = "SET FOREIGN_KEY_CHECKS=0;\n";
    foreach($tables as $t) {
        $row2 = $conn->query("SHOW CREATE TABLE $t")->fetch_row();
        $out .= "\n\n" . $row2[1] . ";\n\n";
        $resD = $conn->query("SELECT * FROM $t");
        while($r = $resD->fetch_row()) {
            $out .= "INSERT INTO $t VALUES(";
            for($j=0; $j<$resD->field_count; $j++) {
                $out .= isset($r[$j]) ? '"'.$conn->real_escape_string($r[$j]).'"' : "NULL";
                if($j < ($resD->field_count - 1)) $out .= ",";
            }
            $out .= ");\n";
        }
    }
    echo $out . "\nSET FOREIGN_KEY_CHECKS=1;";
    exit;
}

// --- RESETEO DE BASE DE DATOS (DOS NIVELES) ---
if ($task == 'reset_database') {
    if ($_SESSION['user_rol'] !== 'ADMINISTRADOR') json_error("Acceso denegado.");

    $modo = $_POST['modo'] ?? 'CATALOGO'; // 'TODO' o 'CATALOGO'
    $conn->begin_transaction();

    try {
        $conn->query("SET FOREIGN_KEY_CHECKS = 0");

        // 1. Limpieza de movimientos operativos (Siempre se borran)
        $tablas = ['detalle_venta', 'ventas', 'kardex', 'egresos', 'cajas'];
        foreach ($tablas as $t) { $conn->query("TRUNCATE TABLE $t"); }

        if ($modo === 'TODO') {
            // Borrado de alto nivel
            $conn->query("TRUNCATE TABLE lotes");
            $conn->query("TRUNCATE TABLE productos");
            $msg = "Sistema reiniciado completamente.";
        } else {
            // Salvaguardar catálogos: Solo borramos stock y lotes
            $conn->query("TRUNCATE TABLE lotes");
            $conn->query("UPDATE productos SET stock = 0");
            $msg = "Ventas e historial limpiados. Catálogo de productos conservado.";
        }

        $conn->query("SET FOREIGN_KEY_CHECKS = 1");
        $conn->commit();
        json_response(['success' => true, 'message' => $msg]);
    } catch (Exception $e) {
        $conn->rollback();
        json_error($e->getMessage());
    }
}