<?php

/**
 * Script de Teste - Migration Multi-Tenant
 *
 * Este script testa se a migration foi executada corretamente
 * e se o sistema está isolando dados entre empresas.
 *
 * Uso: php testar_migration.php
 */

// Carregar o CodeIgniter
require 'vendor/autoload.php';

$app = \Config\Services::codeigniter();
$app->initialize();

$db = \Config\Database::connect();

echo "\n";
echo "========================================================\n";
echo "  TESTE DE MIGRATION - MULTI-TENANT\n";
echo "========================================================\n";
echo "\n";

// ====================================================================
// TESTE 1: Verificar se as tabelas existem
// ====================================================================

echo "TESTE 1: Verificando existência das tabelas...\n";
echo "------------------------------------------------\n";

$tabelasNecessarias = ['mensagens', 'marcacoes'];
$tabelasOk = true;

foreach ($tabelasNecessarias as $tabela) {
    if ($db->tableExists($tabela)) {
        echo "✓ Tabela '{$tabela}' existe\n";
    } else {
        echo "✗ Tabela '{$tabela}' NÃO existe\n";
        $tabelasOk = false;
    }
}

if (!$tabelasOk) {
    echo "\n❌ ERRO: Tabelas necessárias não existem!\n\n";
    exit(1);
}

echo "\n";

// ====================================================================
// TESTE 2: Verificar se as colunas user_id existem
// ====================================================================

echo "TESTE 2: Verificando colunas user_id...\n";
echo "------------------------------------------------\n";

$colunasOk = true;

foreach ($tabelasNecessarias as $tabela) {
    $fields = $db->getFieldNames($tabela);

    if (in_array('user_id', $fields)) {
        echo "✓ Coluna 'user_id' existe na tabela '{$tabela}'\n";
    } else {
        echo "✗ Coluna 'user_id' NÃO existe na tabela '{$tabela}'\n";
        echo "  Execute: php spark migrate\n";
        $colunasOk = false;
    }
}

if (!$colunasOk) {
    echo "\n❌ ERRO: Execute a migration primeiro!\n";
    echo "Comando: php spark migrate\n\n";
    exit(1);
}

echo "\n";

// ====================================================================
// TESTE 3: Verificar índices
// ====================================================================

echo "TESTE 3: Verificando índices...\n";
echo "------------------------------------------------\n";

$indicesEsperados = [
    'mensagens' => [
        'idx_mensagens_user_id',
        'idx_mensagens_user_instance'
    ],
    'marcacoes' => [
        'idx_marcacoes_user_id',
        'idx_marcacoes_user_date'
    ]
];

foreach ($indicesEsperados as $tabela => $indices) {
    echo "Tabela '{$tabela}':\n";

    foreach ($indices as $indexName) {
        $query = $db->query("SHOW INDEX FROM `{$tabela}` WHERE Key_name = '{$indexName}'");

        if ($query->getNumRows() > 0) {
            echo "  ✓ Índice '{$indexName}' existe\n";
        } else {
            echo "  ⚠ Índice '{$indexName}' não existe (não crítico)\n";
        }
    }
}

echo "\n";

// ====================================================================
// TESTE 4: Verificar registros sem user_id
// ====================================================================

echo "TESTE 4: Verificando registros sem user_id...\n";
echo "------------------------------------------------\n";

$registrosSemUserId = false;

foreach ($tabelasNecessarias as $tabela) {
    $count = $db->table($tabela)
        ->where('user_id', 0)
        ->countAllResults();

    if ($count > 0) {
        echo "⚠ Tabela '{$tabela}': {$count} registros sem user_id\n";
        $registrosSemUserId = true;
    } else {
        echo "✓ Tabela '{$tabela}': Todos os registros têm user_id\n";
    }
}

if ($registrosSemUserId) {
    echo "\n⚠️  ATENÇÃO: Execute o comando para atualizar os registros:\n";
    echo "php spark migrate:update-userids <SEU_USER_ID>\n";
}

echo "\n";

// ====================================================================
// TESTE 5: Verificar distribuição de user_id
// ====================================================================

echo "TESTE 5: Distribuição de user_id...\n";
echo "------------------------------------------------\n";

foreach ($tabelasNecessarias as $tabela) {
    $total = $db->table($tabela)->countAllResults();

    if ($total > 0) {
        echo "Tabela '{$tabela}' (Total: {$total}):\n";

        $distribuicao = $db->query(
            "SELECT user_id, COUNT(*) as total FROM `{$tabela}` GROUP BY user_id ORDER BY user_id"
        )->getResultArray();

        foreach ($distribuicao as $row) {
            $userId = $row['user_id'];
            $count = $row['total'];

            if ($userId == 0) {
                echo "  ⚠ user_id = 0: {$count} registros (PRECISA ATUALIZAR)\n";
            } else {
                echo "  ✓ user_id = {$userId}: {$count} registros\n";
            }
        }
    } else {
        echo "Tabela '{$tabela}': Sem registros\n";
    }

    echo "\n";
}

// ====================================================================
// TESTE 6: Testar Models com Hooks
// ====================================================================

echo "TESTE 6: Testando hooks dos Models...\n";
echo "------------------------------------------------\n";

try {
    // Criar sessão fake para teste
    $_SESSION['user_id'] = 999; // ID de teste

    // Testar MensagemModel
    $mensagemModel = new \App\Models\MensagemModel();
    echo "✓ MensagemModel carregado\n";

    // Verificar se o método getMensagensByUser existe
    if (method_exists($mensagemModel, 'getMensagensByUser')) {
        echo "✓ Método getMensagensByUser() existe\n";
    } else {
        echo "✗ Método getMensagensByUser() NÃO existe\n";
    }

    // Verificar se o método verificarPermissao existe
    if (method_exists($mensagemModel, 'verificarPermissao')) {
        echo "✓ Método verificarPermissao() existe\n";
    } else {
        echo "✗ Método verificarPermissao() NÃO existe\n";
    }

    // Testar EventoModel
    $eventoModel = new \App\Models\EventoModel();
    echo "✓ EventoModel carregado\n";

    // Verificar se o método getEventosByUser existe
    if (method_exists($eventoModel, 'getEventosByUser')) {
        echo "✓ Método getEventosByUser() existe\n";
    } else {
        echo "✗ Método getEventosByUser() NÃO existe\n";
    }

} catch (\Exception $e) {
    echo "✗ Erro ao testar models: " . $e->getMessage() . "\n";
}

echo "\n";

// ====================================================================
// RESULTADO FINAL
// ====================================================================

echo "========================================================\n";

if (!$colunasOk) {
    echo "❌ MIGRATION NÃO EXECUTADA\n";
    echo "Execute: php spark migrate\n";
} elseif ($registrosSemUserId) {
    echo "⚠️  MIGRATION EXECUTADA - ATUALIZE OS REGISTROS\n";
    echo "Execute: php spark migrate:update-userids <SEU_USER_ID>\n";
} else {
    echo "✅ TUDO OK - SISTEMA PRONTO PARA USO!\n";
}

echo "========================================================\n";
echo "\n";

echo "📚 Para mais informações, consulte:\n";
echo "  • INSTRUCOES_MIGRATION.md\n";
echo "  • RELATORIO_CORRECOES_SEGURANCA.md\n";
echo "\n";
