<?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'];

if ($method !== 'POST') {
    echo json_encode(['status' => 'error', 'message' => 'Apenas POST permitido']);
    exit;
}

try {
    // Receber o JSON do backup
    $data = json_decode(file_get_contents('php://input'), true);
    
    if (!$data) {
        echo json_encode(['status' => 'error', 'message' => 'JSON inválido']);
        exit;
    }

    $pdo->beginTransaction();

    // PASSO 1: Importar Ativos (stocks)
    if (isset($data['stocks']) && is_array($data['stocks'])) {
        foreach ($data['stocks'] as $stock) {
            $ticker = strtoupper($stock['ticker']);
            $qty = intval($stock['qty']);
            $avgPrice = floatval($stock['avgPrice']);

            // Verificar se ativo já existe
            $stmtCheck = $pdo->prepare("SELECT id FROM ativos WHERE ticker = ? AND usuario_id = ?");
            $stmtCheck->execute([$ticker, $usuario_id]);
            $ativo_existente = $stmtCheck->fetch();

            if ($ativo_existente) {
                // Atualizar quantidade e preço médio
                $stmtUpdate = $pdo->prepare("
                    UPDATE ativos 
                    SET quantidade_total = ?, preco_medio = ?
                    WHERE id = ? AND usuario_id = ?
                ");
                $stmtUpdate->execute([$qty, $avgPrice, $ativo_existente['id'], $usuario_id]);
                $ativo_id = $ativo_existente['id'];
            } else {
                // Inserir novo ativo
                $stmtInsert = $pdo->prepare("
                    INSERT INTO ativos (usuario_id, ticker, nome, tipo, quantidade_total, preco_medio)
                    VALUES (?, ?, ?, ?, ?, ?)
                ");
                $stmtInsert->execute([$usuario_id, $ticker, $ticker, 'ACAO', $qty, $avgPrice]);
                $ativo_id = $pdo->lastInsertId();
            }

            // Registrar movimento de importação
            $stmtMov = $pdo->prepare("
                INSERT INTO movimentacoes (usuario_id, ativo_id, tipo_movimento, quantidade, preco_unitario, notas, data_movimento)
                VALUES (?, ?, ?, ?, ?, ?, CURDATE())
            ");
            $stmtMov->execute([$usuario_id, $ativo_id, 'COMPRA', $qty, $avgPrice, 'Importado do backup']);
        }
    }

    // PASSO 2: Importar Operações Abertas (open)
    if (isset($data['open']) && is_array($data['open'])) {
        foreach ($data['open'] as $op) {
            $ticker = strtoupper($op['ticker']);
            
            // Buscar o ativo
            $stmtAtivo = $pdo->prepare("SELECT id FROM ativos WHERE ticker = ? AND usuario_id = ?");
            $stmtAtivo->execute([$ticker, $usuario_id]);
            $ativo = $stmtAtivo->fetch();

            if (!$ativo) {
                // Se não existe, criar o ativo primeiro
                $stmtInsert = $pdo->prepare("
                    INSERT INTO ativos (usuario_id, ticker, nome, tipo, quantidade_total, preco_medio)
                    VALUES (?, ?, ?, ?, ?, ?)
                ");
                $stmtInsert->execute([$usuario_id, $ticker, $ticker, 'ACAO', 0, 0]);
                $ativo_id = $pdo->lastInsertId();
            } else {
                $ativo_id = $ativo['id'];
            }

            // Inserir operação aberta
            $ticker_opcao = $ticker . 'C' . str_replace('-', '', $op['expiry']); // MGLU3C20260320
            $strike = floatval($op['strike']);
            $premium = floatval($op['premium']);
            $contracts = intval($op['contracts']);
            $data_operacao = substr($op['tradeDate'], 0, 10);
            $data_vencimento = $op['expiry'];

            $stmtOp = $pdo->prepare("
                INSERT INTO operacoes_opcoes 
                (usuario_id, ativo_id, ticker_opcao, tipo_opcao, direcao, strike, premium, contracts, data_operacao, data_vencimento, status)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
            ");
            $stmtOp->execute([
                $usuario_id, $ativo_id, $ticker_opcao, 'CALL', 'VENDA', 
                $strike, $premium, $contracts, $data_operacao, $data_vencimento, 'ABERTA'
            ]);

            // Bloquear ações para venda coberta
            $qtd_bloquear = $contracts * 100;
            $stmtBloquear = $pdo->prepare("
                UPDATE ativos 
                SET quantidade_bloqueada = quantidade_bloqueada + ?
                WHERE id = ?
            ");
            $stmtBloquear->execute([$qtd_bloquear, $ativo_id]);
        }
    }

    // PASSO 3: Importar Histórico (history)
    if (isset($data['history']) && is_array($data['history'])) {
        foreach ($data['history'] as $hist) {
            $ticker = strtoupper($hist['ticker']);
            
            // Buscar o ativo
            $stmtAtivo = $pdo->prepare("SELECT id FROM ativos WHERE ticker = ? AND usuario_id = ?");
            $stmtAtivo->execute([$ticker, $usuario_id]);
            $ativo = $stmtAtivo->fetch();

            if (!$ativo) {
                continue; // Pular se ativo não existe
            }

            $ativo_id = $ativo['id'];
            $ticker_opcao = $ticker . 'C' . str_replace('-', '', $hist['expiry']);
            $strike = floatval($hist['strike']);
            $premium = floatval($hist['premium']);
            $contracts = intval($hist['contracts']);
            $data_operacao = substr($hist['tradeDate'], 0, 10);
            $data_vencimento = $hist['expiry'];
            $preco_fechamento = floatval($hist['closePrice']);
            $gross = floatval($hist['gross']);
            $ir = floatval($hist['ir']);
            $net = floatval($hist['net']);
            
            // Mapear status
            $status_map = [
                'Virou po' => 'EXERCIDA',
                'Vencida' => 'VENCIDA',
                'Fechada' => 'FECHADA'
            ];
            $status = $status_map[$hist['status']] ?? 'FECHADA';

            // Inserir operação fechada
            $stmtHistOp = $pdo->prepare("
                INSERT INTO operacoes_opcoes 
                (usuario_id, ativo_id, ticker_opcao, tipo_opcao, direcao, strike, premium, contracts, 
                 data_operacao, data_vencimento, status, preco_fechamento, data_fechamento, gross, ir, net)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
            ");
            $stmtHistOp->execute([
                $usuario_id, $ativo_id, $ticker_opcao, 'CALL', 'VENDA',
                $strike, $premium, $contracts, $data_operacao, $data_vencimento, $status,
                $preco_fechamento, $hist['closedAt'], $gross, $ir, $net
            ]);
        }
    }

    $pdo->commit();
    
    echo json_encode([
        'status' => 'success',
        'message' => 'Backup importado com sucesso! Seus dados foram restaurados.',
        'resumo' => [
            'ativos_importados' => count($data['stocks'] ?? []),
            'operacoes_abertas' => count($data['open'] ?? []),
            'operacoes_historico' => count($data['history'] ?? [])
        ]
    ]);

} catch (Exception $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    echo json_encode(['status' => 'error', 'message' => 'Erro ao importar: ' . $e->getMessage()]);
}
?>
