<?php
/**
 * Script para testar conexão com banco de dados e verificar módulo E-commerce
 * 
 * Uso: php scripts/test_ecommerce_db.php [tenant_id]
 * Exemplo: php scripts/test_ecommerce_db.php default
 */

require __DIR__ . '/../bootstrap.php';

use Gestoreasy\Core\Config\Config;
use Gestoreasy\Core\Tenant\ConnectionManager;
use Gestoreasy\Core\Tenant\TenantContext;
use PDO;

// Obter tenant ID do argumento ou usar 'default'
$tenantId = $argv[1] ?? 'default';
TenantContext::setTenantId($tenantId);

echo "========================================\n";
echo "Teste de Conexão - Módulo E-commerce\n";
echo "========================================\n\n";

// Configurações do banco
$dbHost = Config::get('DB_HOST', '127.0.0.1');
$dbUser = Config::get('DB_USERNAME', 'root');
$dbPass = Config::get('DB_PASSWORD', '');
$dbBase = Config::get('DB_BASE_PREFIX', 'gestoreasy_tenant_');
$dbName = $dbBase . $tenantId;

echo "Configurações:\n";
echo "  Host: $dbHost\n";
echo "  Usuário: $dbUser\n";
echo "  Senha: " . (empty($dbPass) ? '(vazia)' : '***') . "\n";
echo "  Database: $dbName\n";
echo "  Tenant ID: $tenantId\n\n";

// Teste 1: Conexão com o servidor MySQL
echo "1. Testando conexão com servidor MySQL...\n";
try {
    $dsn = "mysql:host=$dbHost;charset=utf8mb4";
    $serverPdo = new PDO($dsn, $dbUser, $dbPass, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    ]);
    echo "   ✓ Conexão com servidor MySQL estabelecida!\n\n";
} catch (PDOException $e) {
    echo "   ✗ Erro ao conectar ao servidor MySQL: " . $e->getMessage() . "\n";
    echo "   Verifique se o XAMPP está rodando e se as credenciais estão corretas.\n";
    exit(1);
}

// Teste 2: Verificar se o banco existe
echo "2. Verificando se o banco de dados existe...\n";
try {
    $stmt = $serverPdo->query("SHOW DATABASES LIKE '$dbName'");
    $exists = $stmt->fetch();
    if ($exists) {
        echo "   ✓ Banco de dados '$dbName' existe!\n\n";
    } else {
        echo "   ⚠ Banco de dados '$dbName' não existe.\n";
        echo "   Deseja criar? (s/n): ";
        $handle = fopen("php://stdin", "r");
        $line = trim(fgets($handle));
        fclose($handle);
        if (strtolower($line) === 's') {
            $serverPdo->exec("CREATE DATABASE `$dbName` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
            echo "   ✓ Banco de dados criado!\n\n";
        } else {
            echo "   Saindo...\n";
            exit(1);
        }
    }
} catch (PDOException $e) {
    echo "   ✗ Erro ao verificar banco: " . $e->getMessage() . "\n";
    exit(1);
}

// Teste 3: Conexão com o banco do tenant
echo "3. Conectando ao banco do tenant...\n";
try {
    $pdo = ConnectionManager::forTenant($tenantId);
    echo "   ✓ Conectado ao banco do tenant!\n\n";
} catch (PDOException $e) {
    echo "   ✗ Erro ao conectar ao banco do tenant: " . $e->getMessage() . "\n";
    exit(1);
}

// Teste 4: Verificar tabelas do E-commerce
echo "4. Verificando tabelas do módulo E-commerce...\n";
$tabelasEcommerce = [
    'ecommerce_config',
    'ecommerce_dominios',
    'ecommerce_pagamentos',
    'ecommerce_produtos',
    'ecommerce_categorias',
    'ecommerce_produto_categorias',
    'ecommerce_pedidos',
    'ecommerce_pedido_itens',
    'ecommerce_templates',
    'ecommerce_frete_config',
    'ecommerce_produto_imagens',
    'ecommerce_avaliacoes',
    'ecommerce_cupons',
    'ecommerce_cupom_usos'
];

$tabelasExistentes = [];
$tabelasFaltando = [];

foreach ($tabelasEcommerce as $tabela) {
    try {
        $stmt = $pdo->query("SHOW TABLES LIKE '$tabela'");
        if ($stmt->fetch()) {
            $tabelasExistentes[] = $tabela;
            echo "   ✓ $tabela existe\n";
        } else {
            $tabelasFaltando[] = $tabela;
            echo "   ✗ $tabela NÃO existe\n";
        }
    } catch (PDOException $e) {
        $tabelasFaltando[] = $tabela;
        echo "   ✗ Erro ao verificar $tabela: " . $e->getMessage() . "\n";
    }
}

echo "\n";
echo "   Resumo: " . count($tabelasExistentes) . " tabelas existem, " . count($tabelasFaltando) . " faltando\n\n";

// Teste 5: Verificar migrações aplicadas
echo "5. Verificando migrações do módulo E-commerce...\n";
try {
    $stmt = $pdo->query("SELECT * FROM schema_migrations WHERE module = 'Ecommerce' ORDER BY applied_at DESC");
    $migrations = $stmt->fetchAll();
    
    if (empty($migrations)) {
        echo "   ⚠ Nenhuma migração do E-commerce foi aplicada ainda.\n";
        echo "   Execute uma requisição HTTP para o sistema para aplicar as migrações automaticamente.\n";
    } else {
        echo "   Migrações aplicadas:\n";
        foreach ($migrations as $migration) {
            echo "     ✓ {$migration['filename']} - {$migration['applied_at']}\n";
        }
    }
    echo "\n";
} catch (PDOException $e) {
    echo "   ⚠ Tabela schema_migrations não existe ou erro ao consultar: " . $e->getMessage() . "\n\n";
}

// Teste 6: Verificar configuração do e-commerce
echo "6. Verificando configuração do e-commerce...\n";
try {
    $stmt = $pdo->query("SELECT * FROM ecommerce_config WHERE tenant_id = '$tenantId' LIMIT 1");
    $config = $stmt->fetch();
    
    if ($config) {
        echo "   ✓ Configuração encontrada:\n";
        echo "     - Nome da loja: " . ($config['store_name'] ?? 'N/A') . "\n";
        echo "     - Habilitado: " . ($config['enabled'] ? 'Sim' : 'Não') . "\n";
        echo "     - Template: " . ($config['template_id'] ?? 'N/A') . "\n";
    } else {
        echo "   ⚠ Nenhuma configuração encontrada. O e-commerce ainda não foi configurado.\n";
    }
    echo "\n";
} catch (PDOException $e) {
    echo "   ⚠ Erro ao verificar configuração: " . $e->getMessage() . "\n\n";
}

// Teste 7: Verificar produtos visíveis
echo "7. Verificando produtos no e-commerce...\n";
try {
    $stmt = $pdo->query("SELECT COUNT(*) as total FROM ecommerce_produtos WHERE tenant_id = '$tenantId' AND visible = TRUE");
    $result = $stmt->fetch();
    $total = (int)($result['total'] ?? 0);
    echo "   Produtos visíveis no e-commerce: $total\n\n";
} catch (PDOException $e) {
    echo "   ⚠ Erro ao verificar produtos: " . $e->getMessage() . "\n\n";
}

// Teste 8: Verificar pedidos
echo "8. Verificando pedidos do e-commerce...\n";
try {
    $stmt = $pdo->query("SELECT COUNT(*) as total FROM ecommerce_pedidos WHERE tenant_id = '$tenantId'");
    $result = $stmt->fetch();
    $total = (int)($result['total'] ?? 0);
    
    if ($total > 0) {
        $stmt = $pdo->query("SELECT status, COUNT(*) as count FROM ecommerce_pedidos WHERE tenant_id = '$tenantId' GROUP BY status");
        $statuses = $stmt->fetchAll();
        echo "   Total de pedidos: $total\n";
        foreach ($statuses as $status) {
            echo "     - {$status['status']}: {$status['count']}\n";
        }
    } else {
        echo "   Nenhum pedido encontrado.\n";
    }
    echo "\n";
} catch (PDOException $e) {
    echo "   ⚠ Erro ao verificar pedidos: " . $e->getMessage() . "\n\n";
}

// Resumo final
echo "========================================\n";
echo "Resumo Final\n";
echo "========================================\n";
echo "✓ Conexão com banco: OK\n";
echo "✓ Banco do tenant: OK\n";
echo "✓ Tabelas do e-commerce: " . count($tabelasExistentes) . "/" . count($tabelasEcommerce) . "\n";

if (!empty($tabelasFaltando)) {
    echo "\n⚠ ATENÇÃO: As seguintes tabelas estão faltando:\n";
    foreach ($tabelasFaltando as $tabela) {
        echo "   - $tabela\n";
    }
    echo "\nPara criar as tabelas faltantes, acesse o sistema via navegador\n";
    echo "ou execute as migrações manualmente.\n";
}

echo "\n========================================\n";
echo "Teste concluído!\n";
echo "========================================\n";

