<?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 {
    switch ($method) {
        case 'GET':
            // Listar operações
            $tipo = $_GET['tipo'] ?? 'todas';
            
            if ($tipo === 'abertas') {
                $stmt = $pdo->prepare("
                    SELECT o.*, a.ticker as ativo_subjacente 
                    FROM operacoes_opcoes o
                    JOIN ativos a ON o.ativo_id = a.id
                    WHERE o.usuario_id = ? AND o.status = 'ABERTA'
                    ORDER BY o.data_vencimento ASC
                ");
            } else if ($tipo === 'historico') {
                $stmt = $pdo->prepare("
                    SELECT o.*, a.ticker as ativo_subjacente 
                    FROM operacoes_opcoes o
                    JOIN ativos a ON o.ativo_id = a.id
                    WHERE o.usuario_id = ? AND o.status != 'ABERTA'
                    ORDER BY o.data_fechamento DESC
                ");
            } else {
                $stmt = $pdo->prepare("
                    SELECT o.*, a.ticker as ativo_subjacente 
                    FROM operacoes_opcoes o
                    JOIN ativos a ON o.ativo_id = a.id
                    WHERE o.usuario_id = ?
                    ORDER BY o.criado_em DESC
                ");
            }
            
            $stmt->execute([$usuario_id]);
            $operacoes = $stmt->fetchAll();
            echo json_encode(['status' => 'success', 'data' => $operacoes]);
            break;

        case 'POST':
            // Criar nova operação (Venda Coberta)
            $data = json_decode(file_get_contents('php://input'), true);
            
            $ativo_id = $data['ativo_id'];
            $ticker_opcao = strtoupper($data['ticker_opcao']);
            $tipo_opcao = $data['tipo_opcao']; // CALL ou PUT
            $direcao = $data['direcao']; // COMPRA ou VENDA
            $strike = $data['strike'];
            $premium = $data['premium'];
            $contracts = $data['contracts'];
            $data_operacao = $data['data_operacao'];
            $data_vencimento = $data['data_vencimento'];
            $notas = $data['notas'] ?? '';

            $pdo->beginTransaction();

            // Inserir operação
            $stmt = $pdo->prepare("
                INSERT INTO operacoes_opcoes 
                (usuario_id, ativo_id, ticker_opcao, tipo_opcao, direcao, strike, premium, contracts, data_operacao, data_vencimento, notas)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
            ");
            
            $stmt->execute([
                $usuario_id, $ativo_id, $ticker_opcao, $tipo_opcao, $direcao, 
                $strike, $premium, $contracts, $data_operacao, $data_vencimento, $notas
            ]);
            
            $operacao_id = $pdo->lastInsertId();

            // Se for venda de CALL (Venda Coberta), bloquear as ações
            if ($tipo_opcao === 'CALL' && $direcao === 'VENDA') {
                $qtd_bloquear = $contracts * 100;
                
                // Verificar se tem saldo livre
                $stmtCheck = $pdo->prepare("SELECT quantidade_total, quantidade_bloqueada FROM ativos WHERE id = ? AND usuario_id = ?");
                $stmtCheck->execute([$ativo_id, $usuario_id]);
                $ativo = $stmtCheck->fetch();
                
                $livre = $ativo['quantidade_total'] - $ativo['quantidade_bloqueada'];
                
                if ($livre < $qtd_bloquear) {
                    $pdo->rollBack();
                    echo json_encode(['status' => 'error', 'message' => "Saldo insuficiente para venda coberta. Livre: $livre, Necessário: $qtd_bloquear"]);
                    exit;
                }
                
                // Atualizar bloqueio
                $stmtUpdate = $pdo->prepare("UPDATE ativos SET quantidade_bloqueada = quantidade_bloqueada + ? WHERE id = ?");
                $stmtUpdate->execute([$qtd_bloquear, $ativo_id]);
            }

            registrar_auditoria($pdo, $usuario_id, 'CRIAR_OPERACAO', 'operacoes_opcoes', $operacao_id, null, $data);
            
            $pdo->commit();
            echo json_encode(['status' => 'success', 'message' => 'Operação registrada com sucesso']);
            break;

        case 'PUT':
            // Fechar/Exercer/Vencer operação
            $data = json_decode(file_get_contents('php://input'), true);
            $operacao_id = $data['id'];
            $novo_status = $data['status']; // EXERCIDA, VENCIDA, FECHADA
            $preco_fechamento = $data['preco_fechamento'] ?? 0;
            
            $pdo->beginTransaction();
            
            // Buscar dados da operação atual
            $stmt = $pdo->prepare("SELECT * FROM operacoes_opcoes WHERE id = ? AND usuario_id = ?");
            $stmt->execute([$operacao_id, $usuario_id]);
            $op = $stmt->fetch();
            
            if (!$op || $op['status'] !== 'ABERTA') {
                $pdo->rollBack();
                echo json_encode(['status' => 'error', 'message' => 'Operação inválida ou já fechada']);
                exit;
            }
            
            // Lógica de cálculo (Padrão do JSON do usuário: gross, ir, net)
            $gross = 0;
            if ($op['direcao'] === 'VENDA') {
                // Vendeu caro, comprou barato (ou virou pó)
                $gross = ($op['premium'] - $preco_fechamento) * $op['contracts'] * 100;
            } else {
                // Comprou barato, vendeu caro
                $gross = ($preco_fechamento - $op['premium']) * $op['contracts'] * 100;
            }
            
            $ir = $gross > 0 ? $gross * 0.15 : 0; // 15% sobre lucro
            $net = $gross - $ir;
            
            // Atualizar operação
            $stmtUpdate = $pdo->prepare("
                UPDATE operacoes_opcoes 
                SET status = ?, preco_fechamento = ?, data_fechamento = NOW(), gross = ?, ir = ?, net = ?
                WHERE id = ?
            ");
            $stmtUpdate->execute([$novo_status, $preco_fechamento, $gross, $ir, $net, $operacao_id]);
            
            // Se for venda coberta, desbloquear as ações
            if ($op['tipo_opcao'] === 'CALL' && $op['direcao'] === 'VENDA') {
                $qtd_desbloquear = $op['contracts'] * 100;
                
                if ($novo_status === 'EXERCIDA') {
                    // Se exercida, remove as ações da carteira (total e bloqueada)
                    $stmtAtivo = $pdo->prepare("UPDATE ativos SET quantidade_total = quantidade_total - ?, quantidade_bloqueada = quantidade_bloqueada - ? WHERE id = ?");
                    $stmtAtivo->execute([$qtd_desbloquear, $qtd_desbloquear, $op['ativo_id']]);
                    
                    // Registrar a venda das ações no movimento
                    $stmtMov = $pdo->prepare("INSERT INTO movimentacoes (usuario_id, ativo_id, tipo_movimento, quantidade, preco_unitario, notas) VALUES (?, ?, 'VENDA', ?, ?, 'Exercício de opção')");
                    $stmtMov->execute([$usuario_id, $op['ativo_id'], $qtd_desbloquear, $op['strike']]);
                    
                } else {
                    // Se virou pó ou foi recomprada, apenas desbloqueia
                    $stmtAtivo = $pdo->prepare("UPDATE ativos SET quantidade_bloqueada = quantidade_bloqueada - ? WHERE id = ?");
                    $stmtAtivo->execute([$qtd_desbloquear, $op['ativo_id']]);
                }
            }
            
            registrar_auditoria($pdo, $usuario_id, 'FECHAR_OPERACAO', 'operacoes_opcoes', $operacao_id, $op, array_merge($op, ['status' => $novo_status]));
            
            $pdo->commit();
            echo json_encode(['status' => 'success', 'message' => "Operação $novo_status com sucesso"]);
            break;

        default:
            echo json_encode(['status' => 'error', 'message' => 'Método não suportado']);
            break;
    }
} catch (Exception $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
}
?>
