<?php
/**
 * API: Registrar Movimiento de Caja (Ingreso/Egreso)
 * Sistema Sufarma
 */

header('Content-Type: application/json');
require_once '../../db_connection.php';

try {
    // Get JSON input
    $input = json_decode(file_get_contents('php://input'), true);
    
    $required = ['sesion_id', 'tipo', 'monto', 'motivo', 'usuario_id'];
    foreach ($required as $field) {
        if (!isset($input[$field]) || $input[$field] === '' || empty($input[$field])) {
            throw new Exception("Campo requerido faltante: $field");
        }
    }
    
    $sesion_id = (int)$input['sesion_id'];
    $tipo = trim($input['tipo']);
    $monto = floatval($input['monto']);
    $motivo = trim($input['motivo']);
    $usuario_id = (int)$input['usuario_id'];
    
    if (!in_array($tipo, ['ingreso', 'egreso'])) {
        throw new Exception("Tipo de movimiento inválido.");
    }
    if ($monto <= 0) {
        throw new Exception("El monto debe ser mayor a cero.");
    }
    
    // Verificar que la sesión de caja exista y esté abierta
    $sesionStmt = $pdo->prepare("SELECT estado, monto_apertura FROM caja_sesiones WHERE id = :sesion_id");
    $sesionStmt->execute(['sesion_id' => $sesion_id]);
    $sesion = $sesionStmt->fetch();
    
    if (!$sesion) {
        throw new Exception("La sesión de caja especificada no existe.");
    }
    if ($sesion['estado'] !== 'abierta') {
        throw new Exception("La sesión de caja ya se encuentra cerrada.");
    }
    
    // Si es un egreso, validar que no exceda el efectivo disponible
    if ($tipo === 'egreso') {
        $monto_apertura = floatval($sesion['monto_apertura']);
        
        // Sumar ventas en efectivo
        $ventasStmt = $pdo->prepare("SELECT SUM(COALESCE(monto_efectivo, 0)) as total_efectivo FROM ventas WHERE caja_sesion_id = :sesion_id");
        $ventasStmt->execute(['sesion_id' => $sesion_id]);
        $ventasRow = $ventasStmt->fetch();
        $total_ventas = $ventasRow ? floatval($ventasRow['total_efectivo']) : 0;
        
        // Sumar ingresos extras
        $ingresosStmt = $pdo->prepare("SELECT SUM(monto) as total_ingresos FROM caja_movimientos WHERE sesion_id = :sesion_id AND tipo = 'ingreso'");
        $ingresosStmt->execute(['sesion_id' => $sesion_id]);
        $ingresosRow = $ingresosStmt->fetch();
        $total_ingresos = $ingresosRow ? floatval($ingresosRow['total_ingresos']) : 0;
        
        // Sumar egresos anteriores
        $egresosStmt = $pdo->prepare("SELECT SUM(monto) as total_egresos FROM caja_movimientos WHERE sesion_id = :sesion_id AND tipo = 'egreso'");
        $egresosStmt->execute(['sesion_id' => $sesion_id]);
        $egresosRow = $egresosStmt->fetch();
        $total_egresos = $egresosRow ? floatval($egresosRow['total_egresos']) : 0;
        
        $saldo_disponible = $monto_apertura + $total_ventas + $total_ingresos - $total_egresos;
        
        if ($monto > $saldo_disponible) {
            throw new Exception("El egreso de Q" . number_format($monto, 2) . " supera el efectivo disponible en caja (Q" . number_format($saldo_disponible, 2) . ").");
        }
    }
    
    // Insertar el movimiento
    $sql = "INSERT INTO caja_movimientos (sesion_id, tipo, monto, motivo, usuario_id) 
            VALUES (:sesion_id, :tipo, :monto, :motivo, :usuario_id)";
            
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        'sesion_id' => $sesion_id,
        'tipo' => $tipo,
        'monto' => $monto,
        'motivo' => $motivo,
        'usuario_id' => $usuario_id
    ]);
    
    echo json_encode([
        'success' => true,
        'message' => 'Movimiento registrado correctamente.'
    ]);
} catch (Exception $e) {
    http_response_code(400);
    echo json_encode([
        'success' => false,
        'error' => $e->getMessage()
    ]);
}
?>
