<?php
// =====================================================
// CONFIGURAÇÕES GERAIS DO SISTEMA
// =====================================================
define("SISTEMA_NOME", "Plataforma de Planos Premium");
define("SISTEMA_VERSAO", "1.2.0");
define("TIMEZONE", "America/Sao_Paulo");
date_default_timezone_set(TIMEZONE);


// =====================================================
// CONFIGURAÇÕES DA API DO TELEGRAM
// =====================================================
define("TELEGRAM_BOT_TOKEN", "5163976037:AAGHfY1KivDDHzqD_hCu9OwOqGtKmbpmZuA"); // Ex: 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
define("TELEGRAM_API_URL", "https://api.telegram.org/bot" . TELEGRAM_BOT_TOKEN . "/");
define("ADMIN_TELEGRAM_ID", 1915055516); // ID do administrador principal
define("GRUPO_SUPORTE_LINK", "https://t.me/seu_grupo_suporte");
define("CANAL_NOTICIAS_LINK", "https://t.me/seu_canal_noticias");


// =====================================================
// CONFIGURAÇÕES DE SEGURANÇA
// =====================================================
define("HASH_KEY", "ChaveSecretaParaHash_2024!"); // Altere para uma chave forte
define("SESSION_EXPIRATION_MINUTES", 30); // Tempo de expiração de sessões
define("MAX_TENTATIVAS_LOGIN", 5);
define("BLOQUEIO_TEMPO_MINUTOS", 15);


// =====================================================
// CONFIGURAÇÕES DO BANCO DE DADOS (SQLite ou MySQL)
// =====================================================
define("DB_TIPO", "SQLITE"); // Ou "MYSQL" para usar banco relacional

// Configurações SQLite
define("DB_SQLITE_PATH", __DIR__ . "/../database/sistema_plans.db");

// Configurações MySQL (caso use DB_TIPO = "MYSQL")
define("DB_MYSQL_HOST", "localhost");
define("DB_MYSQL_USER", "usuario_db");
define("DB_MYSQL_PASS", "senha_db");
define("DB_MYSQL_NAME", "banco_plans");


// =====================================================
// CONFIGURAÇÕES DE PAGAMENTOS
// =====================================================
// PIX (via GerenciaNet ou seu provedor)
define("PIX_PROVEDOR", "GerenciaNet");
define("PIX_CLIENT_ID", "seu_client_id_gerencianet");
define("PIX_CLIENT_SECRET", "seu_client_secret_gerencianet");
define("PIX_CERT_PATH", __DIR__ . "/../certificados/certificado.p12");
define("PIX_SANDBOX", false); // true para testes, false para produção

// TON Blockchain (opcional)
define("TON_ATIVO", true);
define("TON_API_URL", "https://toncenter.com/api/v2/jsonRPC");
define("TON_API_KEY", "sua_chave_api_toncenter");
define("TON_WALLET_ADMIN", "EQXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");

// Configurações de Comissões
define("CASHBACK_PERCENTUAL", 5.0); // 5% de cashback para clientes
define("INDICACAO_PERCENTUAL", 10.0); // 10% de bônus para indicadores
define("REVENDEDOR_MARGEM_PADRAO", 20.0); // Margem padrão para revendedores


// =====================================================
// CONFIGURAÇÕES DE GRUPOS E ACESSOS
// =====================================================
define("GRUPO_PADRAO_ID", "-1001234567890"); // ID do grupo principal
define("DIAS_AVISO_VENCIMENTO", 3); // Avisa 3 dias antes do vencimento
define("TEMPO_LIMPEZA_MEMBROS", 3600); // 1 hora entre verificações


// =====================================================
// FUNÇÕES DE CONEXÃO E MANIPULAÇÃO DO BANCO DE DADOS
// =====================================================
function db_connect() {
    static $conexao;

    if ($conexao) return $conexao;

    try {
        if (DB_TIPO === "MYSQL") {
            $conexao = new PDO(
                "mysql:host=" . DB_MYSQL_HOST . ";dbname=" . DB_MYSQL_NAME . ";charset=utf8mb4",
                DB_MYSQL_USER,
                DB_MYSQL_PASS,
                [
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
                ]
            );
        } else {
            // Cria pasta do banco se não existir
            $pasta = dirname(DB_SQLITE_PATH);
            if (!file_exists($pasta)) mkdir($pasta, 0755, true);
            
            $conexao = new PDO(
                "sqlite:" . DB_SQLITE_PATH,
                null,
                null,
                [
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
                ]
            );
        }
        return $conexao;
    } catch (PDOException $e) {
        bot_log("erro_db.log", "Erro de conexão: " . $e->getMessage());
        die("Erro no sistema, tente novamente mais tarde.");
    }
}

function db_exec($sql, $parametros = []) {
    $conn = db_connect();
    $stmt = $conn->prepare($sql);
    $stmt->execute($parametros);
    return $stmt;
}

function db_fetch($sql, $parametros = []) {
    $stmt = db_exec($sql, $parametros);
    return $stmt->fetch();
}

function db_fetchAll($sql, $parametros = []) {
    $stmt = db_exec($sql, $parametros);
    return $stmt->fetchAll();
}

function db_last_insert_id() {
    $conn = db_connect();
    return $conn->lastInsertId();
}

function db_begin() {
    $conn = db_connect();
    $conn->beginTransaction();
}

function db_commit() {
    $conn = db_connect();
    $conn->commit();
}

function db_rollback() {
    $conn = db_connect();
    $conn->rollBack();
}


// =====================================================
// FUNÇÕES AUXILIARES GERAIS
// =====================================================
function bot_log($arquivo, $mensagem) {
    $pasta_logs = __DIR__ . "/../logs/";
    if (!file_exists($pasta_logs)) mkdir($pasta_logs, 0755, true);
    
    $caminho = $pasta_logs . $arquivo;
    $data_hora = date("[Y-m-d H:i:s]");
    
    if (is_array($mensagem) || is_object($mensagem)) {
        $mensagem = json_encode($mensagem, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
    }
    
    file_put_contents($caminho, $data_hora . " " . $mensagem . PHP_EOL, FILE_APPEND | LOCK_EX);
}

function gerar_hash($valor) {
    return password_hash($valor . HASH_KEY, PASSWORD_DEFAULT);
}

function verificar_hash($valor, $hash) {
    return password_verify($valor . HASH_KEY, $hash);
}

function formatar_valor($valor) {
    return number_format($valor, 2, ",", ".");
}

function formatar_data($data, $formato = "d/m/Y H:i:s") {
    if (empty($data)) return "-";
    $timestamp = strtotime($data);
    return date($formato, $timestamp);
}


// =====================================================
// FUNÇÕES DE COMUNICAÇÃO COM O TELEGRAM
// =====================================================
function enviar_requisicao_telegram($metodo, $dados = []) {
    $url = TELEGRAM_API_URL . $metodo;
    $opcoes = [
        "http" => [
            "header" => "Content-type: application/json\r\n",
            "method" => "POST",
            "content" => json_encode($dados, JSON_UNESCAPED_UNICODE)
        ]
    ];
    $contexto = stream_context_create($opcoes);
    $resposta = file_get_contents($url, false, $contexto);
    
    if ($resposta === false) {
        bot_log("erro_telegram.log", "Falha ao chamar método: " . $metodo);
        return null;
    }
    
    return json_decode($resposta, true);
}

function send_message($chat_id, $texto, $opcoes = []) {
    $dados = [
        "chat_id" => $chat_id,
        "text" => $texto,
        "parse_mode" => "HTML",
        "disable_web_page_preview" => true
    ];
    
    if (!empty($opcoes)) $dados = array_merge($dados, $opcoes);
    return enviar_requisicao_telegram("sendMessage", $dados);
}

function send_photo($chat_id, $caminho_foto, $legenda = "", $opcoes = []) {
    $dados = [
        "chat_id" => $chat_id,
        "photo" => new CURLFile(realpath($caminho_foto)),
        "caption" => $legenda,
        "parse_mode" => "HTML"
    ];
    
    if (!empty($opcoes)) $dados = array_merge($dados, $opcoes);
    
    $curl = curl_init(TELEGRAM_API_URL . "sendPhoto");
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $dados);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    $resposta = curl_exec($curl);
    curl_close($curl);
    
    return json_decode($resposta, true);
}


// =====================================================
// FUNÇÕES DE ESTADOS DO USUÁRIO
// =====================================================
function set_state($telegram_id, $estado, $dados = []) {
    $dados_json = json_encode($dados, JSON_UNESCAPED_UNICODE);
    $expira_em = date("Y-m-d H:i:s", strtotime("+" . SESSION_EXPIRATION_MINUTES . " minutes"));
    
    db_exec(
        "REPLACE INTO user_states (telegram_id, state, data, expires_at) VALUES (?, ?, ?, ?)",
        [$telegram_id, $estado, $dados_json, $expira_em]
    );
}

function get_state($telegram_id) {
    $agora = date("Y-m-d H:i:s");
    $registro = db_fetch(
        "SELECT * FROM user_states WHERE telegram_id=? AND expires_at > ?",
        [$telegram_id, $agora]
    );
    
    if ($registro) {
        $registro["data"] = json_decode($registro["data"], true);
        return $registro;
    }
    
    return null;
}

function clear_state($telegram_id) {
    db_exec("DELETE FROM user_states WHERE telegram_id=?", [$telegram_id]);
}

function cleanup_states() {
    $agora = date("Y-m-d H:i:s");
    db_exec("DELETE FROM user_states WHERE expires_at <= ?", [$agora]);
}


// =====================================================
// INICIALIZAÇÃO: CRIA TABELAS CASO NÃO EXISTAM (SQLite)
// =====================================================
if (DB_TIPO === "SQLITE") {
    $tabelas = [
        // Tabela de usuários
        "CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            telegram_id INTEGER UNIQUE NOT NULL,
            username TEXT,
            first_name TEXT,
            last_name TEXT,
            email TEXT,
            cpf TEXT,
            is_admin INTEGER DEFAULT 0,
            is_reseller INTEGER DEFAULT 0,
            reseller_approved INTEGER DEFAULT 0,
            is_blocked INTEGER DEFAULT 0,
            balance REAL DEFAULT 0.0,
            referral_code TEXT UNIQUE,
            referred_by TEXT,
            created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
            updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
        )",

        // Tabela de planos
        "CREATE TABLE IF NOT EXISTS plans (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            description TEXT,
            price_client REAL NOT NULL,
            price_reseller REAL NOT NULL,
            duration_value INTEGER NOT NULL,
            duration_unit TEXT NOT NULL, -- days, months, years
            status INTEGER DEFAULT 1,
            created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
            updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
        )",

        // Tabela de assinaturas
        "CREATE TABLE IF NOT EXISTS subscriptions (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            user_id INTEGER NOT NULL,
            plan_id INTEGER NOT NULL,
            start_date DATETIME DEFAULT CURRENT_TIMESTAMP,
            expire_date DATETIME NOT NULL,
            is_active INTEGER DEFAULT 1,
            created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
            FOREIGN KEY (user_id) REFERENCES users(id),
            FOREIGN KEY (plan_id) REFERENCES plans(id)
        )",

        // Tabela de grupos vinculados a planos
        "CREATE TABLE IF NOT EXISTS plan_groups (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            plan_id INTEGER NOT NULL,
            group_id TEXT NOT NULL,
            created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
            FOREIGN KEY (plan_id) REFERENCES plans(id),
            UNIQUE(plan_id, group_id)
        )",

        // Tabela de estados dos usuários
        "CREATE TABLE IF NOT EXISTS user_states (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            telegram_id INTEGER NOT NULL,
            state TEXT NOT NULL,
            data TEXT,
            expires_at DATETIME NOT NULL,
            created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
            UNIQUE(telegram_id)
        )",

        // Tabela de vendas
        "CREATE TABLE IF NOT EXISTS sales (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            user_id INTEGER NOT NULL,
            plan_id INTEGER NOT NULL,
            amount REAL NOT NULL,
            payment_method TEXT,
            transaction_id TEXT,
            status TEXT DEFAULT 'completed',
            created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
            FOREIGN KEY (user_id) REFERENCES users(id),
            FOREIGN KEY (plan_id) REFERENCES plans(id)
        )",

        // Tabela de vendas por revendedores
        "CREATE TABLE IF NOT EXISTS reseller_sales (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            reseller_id INTEGER NOT NULL,
            client_id INTEGER NOT NULL,
            plan_id INTEGER NOT NULL,
            reseller_price REAL NOT NULL,
            client_price REAL NOT NULL,
            profit REAL NOT NULL,
            created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
            FOREIGN KEY (reseller_id) REFERENCES users(telegram_id),
            FOREIGN KEY (client_id) REFERENCES users(id),
            FOREIGN KEY (plan_id) REFERENCES plans(id)
        )",

        // Tabela de pagamentos
        "CREATE TABLE IF NOT EXISTS payments (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            user_id INTEGER NOT NULL,
            amount REAL NOT NULL,
            method TEXT NOT NULL,
            transaction_id TEXT UNIQUE NOT NULL,
            status TEXT DEFAULT 'pending',
            details TEXT,
            created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
            updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
            FOREIGN KEY (user_id) REFERENCES users(id)
        )"
    ];

    foreach ($tabelas as $tabela) {
        try {
            db_exec($tabela);
        } catch (PDOException $e) {
            bot_log("erro_criacao_tabelas.log", "Erro ao criar tabela: " . $e->getMessage());
        }
    }
}

// =====================================================
// VERIFICA SE HÁ ATUALIZAÇÕES NECESSÁRIAS
// =====================================================
$versao_atual = db_fetch("SELECT valor FROM sistema_config WHERE chave='versao'")["valor"] ?? "0.0.0";
if ($versao_atual !== SISTEMA_VERSAO) {
    db_exec("REPLACE INTO sistema_config (chave, valor) VALUES ('versao', ?)", [SISTEMA_VERSAO]);
    bot_log("sistema.log", "Sistema atualizado para versão: " . SISTEMA_VERSAO);
}

?>
