<?php
// api/migrar_acao.php
session_start();
header('Content-Type: application/json; charset=UTF-8');

error_reporting(0);
ini_set('display_errors', 0);

require_once '../config.php';

try {
    $pdo = getConexaoAtiva(); // Banco Principal
    $pdo_int = getConexaoInterna(); // Banco Local

    if (!isset($_SESSION['user_id'])) {
        echo json_encode(['success' => false, 'message' => 'Sua sessão expirou. Faça login novamente.']);
        exit;
    }

    // ====================================================================
    // INTELIGÊNCIA ARTIFICIAL: DETECTA SE É XUI ONE OU XTREAM UI
    // ====================================================================
    $modo_ativo = 'interno';
    try {
        $modo_ativo = $pdo_int->query("SELECT modo_ativo FROM configuracoes LIMIT 1")->fetchColumn() ?: 'interno';
    } catch (Exception $e) {}

    $tabela_clientes = ($modo_ativo === 'xui') ? '`lines`' : '`users`';

    $user_id = $_SESSION['user_id'];
    $role = $_SESSION['user_role'] ?? 'reseller';

    $json_input = file_get_contents('php://input');
    $data = json_decode($json_input, true);

    if (!$data) {
        throw new Exception("Nenhum dado recebido do formulário.");
    }

    $modo = $data['modo'] ?? 'individual';
    $api_url = $data['api_url'] ?? '';
    $urls_massa = $data['urls_massa'] ?? '';

    $urls_to_process = [];
    
    if ($modo === 'individual') {
        if (empty(trim($api_url))) throw new Exception("A URL do cliente não pode estar vazia.");
        $urls_to_process[] = trim($api_url);
    } else {
        if (empty(trim($urls_massa))) throw new Exception("A lista de URLs não pode estar vazia.");
        $linhas = explode("\n", $urls_massa);
        foreach ($linhas as $linha) {
            $linha = trim($linha);
            if (!empty($linha)) {
                $urls_to_process[] = $linha;
            }
        }
    }

    if (empty($urls_to_process)) {
        throw new Exception("Nenhuma URL válida encontrada para processar.");
    }

    // =========================================================================
    // LÓGICA DE COBRANÇA DE CRÉDITOS
    // =========================================================================
    try {
        // Busca a configuração no banco interno sempre (pra não dar erro no XUI)
        $stmt_conf = $pdo_int->query("SELECT migracao_cobrar_credito FROM painel_config LIMIT 1");
        $conf = $stmt_conf->fetchColumn();
        $cobrar = ($conf !== false && $conf !== null) ? (int)$conf : 1; 
    } catch(Exception $e) {
        $cobrar = 1;
    }

    $sou_admin_master = ($_SESSION['nivel_admin'] == 1 || $user_id == 11 || $role === 'admin');
    $vai_cobrar = ($cobrar == 1 && !$sou_admin_master);

    if ($vai_cobrar) {
        // Verifica saldo na tabela reg_users no banco interno
        $creditos_atuais = (float) $pdo_int->query("SELECT credits FROM reg_users WHERE id = $user_id")->fetchColumn();
        $quantidade_tentada = count($urls_to_process);
        
        if ($creditos_atuais < $quantidade_tentada) {
            throw new Exception("Saldo insuficiente! Você tem {$creditos_atuais} créditos e está tentando importar {$quantidade_tentada} clientes.");
        }
    }

    // =========================================================================
    // BUSCA O BOUQUET PADRÃO DO PAINEL ATUAL
    // =========================================================================
    // Como não conseguimos o do painel antigo, pegamos um válido local para o cliente não ficar "zerado".
    $bouquet_json = '[]'; 
    try {
        // Pega o primeiro bouquet criado/disponível no seu servidor
        $stmt_bq = $pdo->query("SELECT id FROM bouquets ORDER BY id ASC LIMIT 1");
        $id_bq = $stmt_bq->fetchColumn();
        if ($id_bq) {
            // Xtream/XUI guarda o bouquet na coluna como um array JSON
            $bouquet_json = '["' . (int)$id_bq . '"]';
        }
    } catch (Exception $e) {
        // Se a tabela não existir ou der erro, segue com vazio
    }

    // =========================================================================
    // INICIA A MIGRAÇÃO
    // =========================================================================
    $sucessos = 0;
    $falhas = 0;
    $duplicados = 0;

    foreach ($urls_to_process as $url) {
        $parsed_url = parse_url($url);
        
        if (!isset($parsed_url['query'])) {
            $falhas++;
            continue; 
        }
        
        parse_str($parsed_url['query'], $params);
        $username = $params['username'] ?? '';
        $password = $params['password'] ?? '';

        if (empty($username) || empty($password)) {
            $falhas++;
            continue;
        }

        // Verifica duplicidade no banco detectado (XUI ou Xtream)
        $stmt_check = $pdo->prepare("SELECT id FROM $tabela_clientes WHERE username = ?");
        $stmt_check->execute([$username]);
        if ($stmt_check->fetch()) {
            $duplicados++;
            continue; 
        }

        // Captura da Data de Vencimento
        $exp_date = time() + (30 * 86400); // 30 dias de fallback

        if (isset($parsed_url['scheme']) && isset($parsed_url['host'])) {
            $port = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : '';
            $base_url = $parsed_url['scheme'] . '://' . $parsed_url['host'] . $port;
            
            $api_check_url = $base_url . "/player_api.php?username=" . urlencode($username) . "&password=" . urlencode($password);

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $api_check_url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_TIMEOUT, 10);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            $response = curl_exec($ch);
            curl_close($ch);

            if ($response) {
                $json_api = json_decode($response, true);
                if (isset($json_api['user_info']['exp_date']) && !empty($json_api['user_info']['exp_date'])) {
                    $api_exp = $json_api['user_info']['exp_date'];
                    if (is_numeric($api_exp) && $api_exp > 0) {
                        $exp_date = (int)$api_exp;
                    }
                }
            }
        }

        // =========================================================================
        // INSERÇÃO DO USUÁRIO COM A COLUNA BOUQUET
        // =========================================================================
        $sql_insert = "INSERT INTO $tabela_clientes (username, password, exp_date, enabled, admin_enabled, member_id, bouquet) VALUES (?, ?, ?, 1, 1, ?, ?)";
        $stmt_in = $pdo->prepare($sql_insert);
        $inseriu = $stmt_in->execute([$username, $password, $exp_date, $user_id, $bouquet_json]);

        if ($inseriu) {
            if ($vai_cobrar) {
                // Cobra o crédito do saldo local
                $pdo_int->prepare("UPDATE reg_users SET credits = credits - 1 WHERE id = ?")->execute([$user_id]);
            }
            $sucessos++;
        } else {
            $falhas++;
        }
    }

    $msg_final = "Migração concluída!<br><br>";
    $msg_final .= "<b style='color:var(--success)'>✅ Importados com Sucesso: {$sucessos}</b><br>";
    
    if ($duplicados > 0) {
        $msg_final .= "<b style='color:var(--warning)'>⚠️ Já existiam no painel: {$duplicados}</b><br>";
    }
    if ($falhas > 0) {
        $msg_final .= "<b style='color:var(--danger)'>❌ Falharam (URL inválida): {$falhas}</b>";
    }

    if ($sucessos === 0) {
        echo json_encode(['success' => false, 'message' => $msg_final]);
    } else {
        echo json_encode(['success' => true, 'message' => $msg_final]);
    }

} catch (Exception $e) {
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}
?>