<?php
require_once 'db_config.php';
session_start();

header('Content-Type: application/json');

if (!isset($_SESSION['usuario_id'])) {
    echo json_encode(['status' => 'error', 'message' => 'Não autorizado']);
    exit;
}

$usuario_id = $_SESSION['usuario_id'];
$method = $_SERVER['REQUEST_METHOD'];

try {
    if ($method === 'POST') {
        $data = json_decode(file_get_contents('php://input'), true);
        
        $ativo_id = $data['ativo_id'];
        $tipo_movimento = $data['tipo_movimento']; // COMPRA ou VENDA
        $quantidade = intval($data['quantidade']);
        $preco_unitario = floatval($data['preco_unitario']);
        $data_movimento = $data['data_movimento'] ?? date('Y-m-d');
        
        if ($quantidade <= 0 || $preco_unitario <= 0) {
            echo json_encode(['status' => 'error', 'message' => 'Quantidade e preço devem ser maiores que zero']);
            exit;
        }

        $pdo->beginTransaction();

        // Buscar dados atuais do ativo
        $stmtAtivo = $pdo->prepare("SELECT quantidade_total, quantidade_bloqueada, preco_medio FROM ativos WHERE id = ? AND usuario_id = ? FOR UPDATE");
        $stmtAtivo->execute([$ativo_id, $usuario_id]);
        $ativo = $stmtAtivo->fetch();

        if (!$ativo) {
            $pdo->rollBack();
            echo json_encode(['status' => 'error', 'message' => 'Ativo não encontrado']);
            exit;
        }

        $qtd_atual = intval($ativo['quantidade_total']);
        $preco_medio_atual = floatval($ativo['preco_medio']);
        
        $nova_qtd = $qtd_atual;
        $novo_preco_medio = $preco_medio_atual;

        if ($tipo_movimento === 'COMPRA') {
            // Calcular novo preço médio
            // Fórmula: ((Qtd Atual * Preço Médio Atual) + (Qtd Nova * Preço Novo)) / (Qtd Atual + Qtd Nova)
            $valor_total_atual = $qtd_atual * $preco_medio_atual;
            $valor_compra = $quantidade * $preco_unitario;
            
            $nova_qtd = $qtd_atual + $quantidade;
            $novo_preco_medio = ($valor_total_atual + $valor_compra) / $nova_qtd;
            
        } else if ($tipo_movimento === 'VENDA') {
            // Verificar se tem saldo livre suficiente
            $qtd_livre = $qtd_atual - intval($ativo['quantidade_bloqueada']);
            
            if ($quantidade > $qtd_livre) {
                $pdo->rollBack();
                echo json_encode(['status' => 'error', 'message' => "Saldo livre insuficiente. Você tem $qtd_livre ações livres para venda."]);
                exit;
            }
            
            $nova_qtd = $qtd_atual - $quantidade;
            // Preço médio não muda na venda, apenas a quantidade
        }

        // 1. Inserir a movimentação
        $stmtMov = $pdo->prepare("
            INSERT INTO movimentacoes (usuario_id, ativo_id, tipo_movimento, quantidade, preco_unitario, data_movimento)
            VALUES (?, ?, ?, ?, ?, ?)
        ");
        $stmtMov->execute([$usuario_id, $ativo_id, $tipo_movimento, $quantidade, $preco_unitario, $data_movimento]);

        // 2. Atualizar o ativo
        $stmtUpdate = $pdo->prepare("
            UPDATE ativos 
            SET quantidade_total = ?, preco_medio = ? 
            WHERE id = ?
        ");
        $stmtUpdate->execute([$nova_qtd, $novo_preco_medio, $ativo_id]);

        $pdo->commit();
        
        echo json_encode([
            'status' => 'success', 
            'message' => "Operação de $tipo_movimento registrada com sucesso!",
            'novo_saldo' => $nova_qtd,
            'novo_preco_medio' => $novo_preco_medio
        ]);
        
    } else {
        echo json_encode(['status' => 'error', 'message' => 'Método não suportado']);
    }
} catch (Exception $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
}
?>
