<?php
/**
 * ARCHIVO: api_logic/caja.php
 * DESCRIPCIÓN: Gestión de turnos, arqueos y control de gastos vinculados a la caja.
 */

// =========================================================================
// 0. AUTO-MANTENIMIENTO DE BASE DE DATOS (Solución a fallos de columnas)
// =========================================================================
$conn->query("CREATE TABLE IF NOT EXISTS `cajas` (
  `id_caja` int(11) NOT NULL AUTO_INCREMENT,
  `id_empleado` int(11) NOT NULL,
  `fecha_apertura` datetime DEFAULT current_timestamp(),
  `fecha_cierre` datetime DEFAULT NULL,
  `monto_inicial` decimal(10,2) DEFAULT 0.00,
  `monto_final` decimal(10,2) DEFAULT 0.00,
  `monto_sistema` decimal(10,2) DEFAULT 0.00,
  `estado` varchar(20) DEFAULT 'ABIERTA',
  PRIMARY KEY (`id_caja`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");

// PARCHE CRÍTICO: Asegura que la tabla de egresos tenga todas las columnas necesarias
$conn->query("ALTER TABLE egresos ADD COLUMN IF NOT EXISTS id_usuario INT(11) NOT NULL AFTER id_egreso");
$conn->query("ALTER TABLE egresos ADD COLUMN IF NOT EXISTS id_caja INT(11) NULL AFTER id_usuario");

// =========================================================================
// 1. ESTADO Y APERTURA DE CAJA
// =========================================================================

// Verificar si el usuario tiene una caja abierta
if ($task == 'check_caja_status') {
    $q = $conn->query("SELECT id_caja, monto_inicial, fecha_apertura FROM cajas WHERE id_empleado = $uid AND estado = 'ABIERTA' LIMIT 1");
    if ($q && $q->num_rows > 0) {
        json_response(['status' => 'OPEN', 'data' => $q->fetch_assoc()]);
    } else {
        json_response(['status' => 'CLOSED']);
    }
}

// Abrir caja
if ($task == 'open_caja' && $_SERVER['REQUEST_METHOD'] == 'POST') {
    $monto = (float)($_POST['monto_inicial'] ?? 0);
    
    $check = $conn->query("SELECT id_caja FROM cajas WHERE id_empleado = $uid AND estado = 'ABIERTA'");
    if ($check->num_rows > 0) json_error("Ya tienes una caja abierta.");

    $stmt = $conn->prepare("INSERT INTO cajas (id_empleado, monto_inicial, fecha_apertura, estado) VALUES (?, ?, NOW(), 'ABIERTA')");
    $stmt->bind_param("id", $uid, $monto);
    
    if($stmt->execute()) json_response(['success' => true]);
    else json_error("Error al abrir caja: " . $conn->error);
}

// =========================================================================
// 2. GESTIÓN DE EGRESOS (CONEXIÓN CON ARQUEO)
// =========================================================================

if ($task == 'save_egreso' && $_SERVER['REQUEST_METHOD'] == 'POST') {
    $cat   = $_POST['categoria'] ?? 'Otros';
    $monto = (float)($_POST['monto'] ?? 0);
    $desc  = $_POST['descripcion'] ?? '';

    if ($monto <= 0) json_error("El monto debe ser mayor a cero.");

    // Buscamos la caja activa para que el gasto reste del arqueo final
    $qc = $conn->query("SELECT id_caja FROM cajas WHERE id_empleado = $uid AND estado = 'ABIERTA' LIMIT 1");
    $caja = $qc->fetch_assoc();
    $id_caja = $caja ? $caja['id_caja'] : null;

    $stmt = $conn->prepare("INSERT INTO egresos (id_usuario, id_caja, categoria, monto, descripcion, fecha) VALUES (?, ?, ?, ?, ?, NOW())");
    $stmt->bind_param("iisds", $uid, $id_caja, $cat, $monto, $desc);
    
    if($stmt->execute()) json_response(['success' => true]);
    else json_error("Error SQL al guardar egreso: " . $conn->error);
}

if ($task == 'get_egresos') {
    $res = $conn->query("SELECT * FROM egresos WHERE DATE(fecha) = CURDATE() ORDER BY id_egreso DESC");
    json_response($res->fetch_all(MYSQLI_ASSOC));
}

// =========================================================================
// 3. DETALLES DE CIERRE Y ARQUEO
// =========================================================================

if ($task == 'get_caja_details') {
    $q = $conn->query("SELECT id_caja, monto_inicial FROM cajas WHERE id_empleado = $uid AND estado = 'ABIERTA' LIMIT 1");
    $caja = $q->fetch_assoc();
    if (!$caja) json_error("No hay caja abierta.");
    
    $id_caja = $caja['id_caja'];
    
    // Sumar Ventas en EFECTIVO (Único que afecta el dinero físico)
    $q_v = $conn->query("SELECT COALESCE(SUM(monto_total),0) as t FROM ventas WHERE id_caja = $id_caja AND tipo_pago = 'EFECTIVO' AND estado_venta != 'ANULADA'");
    $ventas_efectivo = (float)$q_v->fetch_assoc()['t'];
    
    // Sumar Ventas DIGITALES (Solo informativo)
    $q_d = $conn->query("SELECT COALESCE(SUM(monto_total),0) as t FROM ventas WHERE id_caja = $id_caja AND tipo_pago != 'EFECTIVO' AND estado_venta != 'ANULADA'");
    $ventas_digital = (float)$q_d->fetch_assoc()['t'];
    
    // Sumar Egresos de ESTA caja específica
    $q_e = $conn->query("SELECT COALESCE(SUM(monto),0) as t FROM egresos WHERE id_caja = $id_caja");
    $egresos = (float)$q_e->fetch_assoc()['t'];
    
    // TOTAL REAL: Inicial + Ventas Efectivo - Egresos
    $total_sistema = (float)$caja['monto_inicial'] + $ventas_efectivo - $egresos;
    
    json_response([
        'inicial' => (float)$caja['monto_inicial'],
        'ventas_efectivo' => $ventas_efectivo,
        'ventas_digital' => $ventas_digital,
        'egresos' => $egresos,
        'total_calculado' => $total_sistema
    ]);
}

if ($task == 'close_caja' && $_SERVER['REQUEST_METHOD'] == 'POST') {
    $q = $conn->query("SELECT id_caja FROM cajas WHERE id_empleado = $uid AND estado = 'ABIERTA'");
    $caja = $q->fetch_assoc();
    if(!$caja) json_error("Caja no encontrada.");

    $m_final = (float)$_POST['monto_final'];
    $m_sistema = (float)$_POST['monto_sistema'];
    
    $stmt = $conn->prepare("UPDATE cajas SET fecha_cierre = NOW(), monto_final = ?, monto_sistema = ?, estado = 'CERRADA' WHERE id_caja = ?");
    $stmt->bind_param("ddi", $m_final, $m_sistema, $caja['id_caja']);
    
    if($stmt->execute()) json_response(['success' => true]);
    else json_error("Error al cerrar caja.");
}