<?php
/**
 * Instalador GESTOR EASY
 * 
 * Este script instala e configura o sistema GESTOR EASY no servidor.
 * Execute: php install.php
 */

error_reporting(E_ALL);
ini_set('display_errors', 1);

// Prompt helper com fallback quando a função readline não está disponível (ex.: Windows)
function prompt(string $message, ?string $default = null): string {
    if (function_exists('readline')) {
        $input = readline($message);
    } else {
        // Fallback: escreve a mensagem e lê do STDIN
        echo $message;
        $input = fgets(STDIN);
    }
    $input = $input !== false ? trim($input) : '';
    if ($input === '' && $default !== null) {
        return $default;
    }
    return $input;
}

// Verificar se já está instalado
if (file_exists('.installed')) {
    die("❌ Sistema já instalado. Para reinstalar, remova o arquivo .installed\n");
}

echo "========================================\n";
echo "  GESTOR EASY - Instalador\n";
echo "========================================\n\n";

// Verificar requisitos
echo "1. Verificando requisitos...\n";
$phpVersion = phpversion();
if (version_compare($phpVersion, '8.1.0', '<')) {
    die("❌ PHP 8.1 ou superior é necessário. Versão atual: $phpVersion\n");
}
echo "✅ PHP $phpVersion\n";

// Verificar extensões
$requiredExtensions = ['pdo', 'pdo_mysql', 'json', 'mbstring', 'openssl', 'curl'];
$missingExtensions = [];
foreach ($requiredExtensions as $ext) {
    if (!extension_loaded($ext)) {
        $missingExtensions[] = $ext;
    }
}
if (!empty($missingExtensions)) {
    die("❌ Extensões PHP necessárias: " . implode(', ', $missingExtensions) . "\n");
}
echo "✅ Extensões PHP: " . implode(', ', $requiredExtensions) . "\n";

// Verificar permissões
$writableDirs = ['storage', 'logs', 'cache'];
foreach ($writableDirs as $dir) {
    if (!is_dir($dir)) {
        mkdir($dir, 0755, true);
    }
    if (!is_writable($dir)) {
        die("❌ Diretório $dir não é gravável. Execute: chmod 755 $dir\n");
    }
}
echo "✅ Permissões de diretórios OK\n\n";

// Coletar informações do banco de dados
echo "2. Configuração do banco de dados\n";
echo "-----------------------------------\n";

$dbHost = prompt("Host do MySQL [localhost]: ", 'localhost');
$dbPort = prompt("Porta do MySQL [3306]: ", '3306');
$dbAdminUser = prompt("Usuário administrador do MySQL: ");
$dbAdminPass = prompt("Senha do MySQL: ");
$dbName = prompt("Nome do banco de dados admin [gestoreasy_admin]: ", 'gestoreasy_admin');

// Conectar ao MySQL
try {
    $pdo = new PDO(
        "mysql:host=$dbHost;port=$dbPort;charset=utf8mb4",
        $dbAdminUser,
        $dbAdminPass,
        [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
        ]
    );
    echo "✅ Conexão com MySQL estabelecida\n";
} catch (PDOException $e) {
    die("❌ Erro ao conectar ao MySQL: " . $e->getMessage() . "\n");
}

// Criar banco de dados admin
try {
    $pdo->exec("CREATE DATABASE IF NOT EXISTS `$dbName` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
    echo "✅ Banco de dados '$dbName' criado\n";
    
    // Usar o banco
    $pdo->exec("USE `$dbName`");
} catch (PDOException $e) {
    die("❌ Erro ao criar banco de dados: " . $e->getMessage() . "\n");
}

// Criar usuário do aplicativo
echo "\n3. Criando usuário do aplicativo\n";
echo "-----------------------------------\n";

$dbUser = prompt("Usuário do aplicativo [gestoreasy_app]: ", 'gestoreasy_app');
$dbPass = prompt("Senha do aplicativo (ou Enter para gerar): ");

if (empty($dbPass)) {
    $dbPass = bin2hex(random_bytes(16));
    echo "✅ Senha gerada: $dbPass\n";
}

// Criar usuário e conceder permissões
try {
    // Remover usuário se existir
    $pdo->exec("DROP USER IF EXISTS '$dbUser'@'$dbHost'");
    
    // Criar usuário
    $pdo->exec("CREATE USER '$dbUser'@'$dbHost' IDENTIFIED BY '$dbPass'");
    
    // Conceder permissões
    $pdo->exec("GRANT ALL PRIVILEGES ON `$dbName`.* TO '$dbUser'@'$dbHost'");
    $pdo->exec("GRANT CREATE ON *.* TO '$dbUser'@'$dbHost'"); // Para criar bancos de tenants
    $pdo->exec("FLUSH PRIVILEGES");
    
    echo "✅ Usuário '$dbUser' criado e permissões concedidas\n";
} catch (PDOException $e) {
    die("❌ Erro ao criar usuário: " . $e->getMessage() . "\n");
}

// Executar migrations do admin
echo "\n4. Executando migrations do admin\n";
echo "-----------------------------------\n";

require_once __DIR__ . '/src/Autoloader.php';
Gestoreasy\Autoloader::register();

use Gestoreasy\Core\Admin\ConnectionManager as AdminDb;
use Gestoreasy\Core\Config\Env as EnvLoader;

// Configurar variáveis de ambiente esperadas pelo ConnectionManager
putenv("DB_HOST=$dbHost"); $_ENV['DB_HOST'] = $dbHost;
putenv("DB_USERNAME=$dbUser"); $_ENV['DB_USERNAME'] = $dbUser;
putenv("DB_PASSWORD=$dbPass"); $_ENV['DB_PASSWORD'] = $dbPass;
putenv("ADMIN_DB_NAME=$dbName"); $_ENV['ADMIN_DB_NAME'] = $dbName;

// Abrir conexão admin
$adminPdo = AdminDb::db();

// Executar migrations do admin
$adminMigrationsDir = __DIR__ . '/modules/Admin/migrations';
if (is_dir($adminMigrationsDir)) {
    $migrations = glob($adminMigrationsDir . '/*.sql');
    sort($migrations);
    
    foreach ($migrations as $migration) {
        echo "  Executando: " . basename($migration) . "\n";
        $sql = file_get_contents($migration);
        $adminPdo->exec($sql);
    }
    echo "✅ Migrations do admin executadas\n";
}

// Criar usuário admin inicial
echo "\n5. Criando usuário administrador inicial\n";
echo "-----------------------------------\n";

$adminEmail = prompt("Email do administrador: ");
$adminName = prompt("Nome do administrador: ");
$adminPassword = prompt("Senha do administrador: ");

if (empty($adminEmail) || empty($adminName) || empty($adminPassword)) {
    die("❌ Email, nome e senha do administrador são obrigatórios\n");
}

try {
    $hashedPassword = password_hash($adminPassword, PASSWORD_DEFAULT);
    $stmt = $adminPdo->prepare('INSERT INTO admin_users (email, name, password_hash) VALUES (?, ?, ?)');
    $stmt->execute([$adminEmail, $adminName, $hashedPassword]);
    echo "✅ Usuário administrador criado\n";
} catch (PDOException $e) {
    die("❌ Erro ao criar usuário administrador: " . $e->getMessage() . "\n");
}

// Gerar chaves JWT
echo "\n6. Gerando chaves de segurança\n";
echo "-----------------------------------\n";

$jwtSecret = bin2hex(random_bytes(32));
$jwtAdminSecret = bin2hex(random_bytes(32));
$apiKey = bin2hex(random_bytes(32));

echo "✅ Chaves geradas\n";

// Criar arquivo .env
echo "\n7. Criando arquivo de configuração\n";
echo "-----------------------------------\n";

$envContent = <<<ENV
# Configurações do Banco de Dados
DB_HOST=$dbHost
DB_PORT=$dbPort
DB_NAME=$dbName
DB_USERNAME=$dbUser
DB_PASSWORD=$dbPass
DB_BASE_PREFIX=gestoreasy_tenant_

# Configurações Admin
ADMIN_DB_NAME=$dbName
ADMIN_DB_USER=$dbUser
ADMIN_DB_PASS=$dbPass

# Chaves JWT
JWT_SECRET=$jwtSecret
JWT_ADMIN_SECRET=$jwtAdminSecret
SPED_API_KEY=$apiKey

# Configurações do Sistema
APP_ENV=production
APP_DEBUG=false
APP_URL=https://seu-dominio.com.br

# Configurações de Segurança
BCRYPT_ROUNDS=12
SESSION_LIFETIME=3600
RATE_LIMIT_ENABLED=true

# Configurações de Email (configurar depois)
SMTP_HOST=
SMTP_PORT=587
SMTP_USER=
SMTP_PASS=
SMTP_FROM=noreply@gestoreasy.com.br

# Redis (opcional)
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASS=

# Logs
LOG_LEVEL=error
LOG_CHANNEL=file
ENV;

file_put_contents('.env', $envContent);
echo "✅ Arquivo .env criado\n";

// Criar arquivo .htaccess se não existir
echo "\n8. Configurando servidor web\n";
echo "-----------------------------------\n";

if (!file_exists('.htaccess')) {
    $htaccessContent = <<<HTACCESS
# GESTOR EASY - Configurações Apache

# Habilitar rewrite engine
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    
    # Redirecionar para HTTPS (descomente se tiver SSL)
    # RewriteCond %{HTTPS} off
    # RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    
    # Bloquear acesso a arquivos sensíveis
    RewriteRule ^\.env$ - [F,L]
    RewriteRule ^\.git - [F,L]
    RewriteRule ^install\.php$ - [F,L]
    RewriteRule ^composer\.(json|lock)$ - [F,L]
    
    # Roteamento
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

# Proteção de arquivos
<FilesMatch "\.(env|git|md|sql)$">
    Order allow,deny
    Deny from all
</FilesMatch>

# Headers de segurança
<IfModule mod_headers.c>
    Header set X-Content-Type-Options "nosniff"
    Header set X-Frame-Options "SAMEORIGIN"
    Header set X-XSS-Protection "1; mode=block"
    Header set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule>

# Compressão
<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json
</IfModule>

# Cache
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType image/jpg "access plus 1 year"
    ExpiresByType image/jpeg "access plus 1 year"
    ExpiresByType image/gif "access plus 1 year"
    ExpiresByType image/png "access plus 1 year"
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 month"
</IfModule>
HTACCESS;

    file_put_contents('.htaccess', $htaccessContent);
    echo "✅ Arquivo .htaccess criado\n";
} else {
    echo "⚠️  Arquivo .htaccess já existe\n";
}

// Criar arquivo de instalação completa
file_put_contents('.installed', date('Y-m-d H:i:s'));
echo "\n✅ Instalação concluída!\n\n";

echo "========================================\n";
echo "  Próximos Passos\n";
echo "========================================\n\n";
echo "1. Configure o APP_URL no arquivo .env\n";
echo "2. Configure as credenciais de email no .env\n";
echo "3. Configure o servidor web para apontar para este diretório\n";
echo "4. Acesse o sistema:\n";
echo "   - Landing Page: https://seu-dominio.com.br/\n";
echo "   - Admin: https://seu-dominio.com.br/admin/login\n";
echo "   - Email: $adminEmail\n";
echo "   - Senha: [a senha que você definiu]\n\n";
echo "⚠️  IMPORTANTE: Remova ou renomeie o arquivo install.php após a instalação!\n\n";

