<?php
// Script para criar/atualizar tabelas do sistema de solicitações de viagem
// Este script verifica tabelas existentes e corrige problemas de FK

// Configuração do banco de dados
$host = 'localhost';
$dbname = 'pinheir3_controle_frotasV1.1';
$username = 'pinheir3_geraldo';
$password = 'Pinheiro@2024';

try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    echo "<h2>Instalação/Atualização do Sistema de Solicitações de Viagem</h2>";
    
    // 1. VERIFICAR E CORRIGIR TABELA SOLICITACOES_VIAGEM
    echo "<h3>1. Verificando tabela solicitacoes_viagem...</h3>";
    
    // Verificar se a tabela existe
    $stmt = $pdo->query("SHOW TABLES LIKE 'solicitacoes_viagem'");
    $tabelaExiste = $stmt->rowCount() > 0;
    
    if ($tabelaExiste) {
        echo "✓ Tabela solicitacoes_viagem já existe<br>";
        
        // Remover chaves estrangeiras existentes (se houver problemas)
        echo "- Removendo chaves estrangeiras problemáticas...<br>";
        
        // Lista de possíveis FKs para remover
        $fks_to_drop = [
            'fk_solicitacao_tecnico',
            'fk_solicitacao_veiculo', 
            'fk_solicitacao_cliente',
            'fk_solicitacao_gestor'
        ];
        
        foreach ($fks_to_drop as $fk_name) {
            try {
                $pdo->exec("ALTER TABLE solicitacoes_viagem DROP FOREIGN KEY $fk_name");
                echo "  ✓ FK $fk_name removida<br>";
            } catch (PDOException $e) {
                // FK não existe, continuar
            }
        }
        
        // Verificar se colunas necessárias existem
        $stmt = $pdo->query("DESCRIBE solicitacoes_viagem");
        $colunas = $stmt->fetchAll(PDO::FETCH_COLUMN);
        
        $colunasNecessarias = [
            'id', 'tecnico_id', 'veiculo_id', 'cliente_id', 'motivo', 
            'prioridade', 'latitude', 'longitude', 'endereco', 
            'status', 'gestor_id', 'resposta_gestor', 'data_criacao', 'data_resposta'
        ];
        
        foreach ($colunasNecessarias as $coluna) {
            if (!in_array($coluna, $colunas)) {
                echo "- Adicionando coluna $coluna...<br>";
                
                switch ($coluna) {
                    case 'prioridade':
                        $pdo->exec("ALTER TABLE solicitacoes_viagem ADD COLUMN prioridade ENUM('baixa', 'normal', 'alta', 'urgente') DEFAULT 'normal'");
                        break;
                    case 'latitude':
                        $pdo->exec("ALTER TABLE solicitacoes_viagem ADD COLUMN latitude DECIMAL(10, 8)");
                        break;
                    case 'longitude':
                        $pdo->exec("ALTER TABLE solicitacoes_viagem ADD COLUMN longitude DECIMAL(11, 8)");
                        break;
                    case 'endereco':
                        $pdo->exec("ALTER TABLE solicitacoes_viagem ADD COLUMN endereco TEXT");
                        break;
                    case 'gestor_id':
                        $pdo->exec("ALTER TABLE solicitacoes_viagem ADD COLUMN gestor_id INT");
                        break;
                    case 'resposta_gestor':
                        $pdo->exec("ALTER TABLE solicitacoes_viagem ADD COLUMN resposta_gestor TEXT");
                        break;
                    case 'data_resposta':
                        $pdo->exec("ALTER TABLE solicitacoes_viagem ADD COLUMN data_resposta TIMESTAMP NULL");
                        break;
                }
                echo "  ✓ Coluna $coluna adicionada<br>";
            }
        }
        
    } else {
        echo "- Criando tabela solicitacoes_viagem...<br>";
        $sql = "
        CREATE TABLE solicitacoes_viagem (
            id INT AUTO_INCREMENT PRIMARY KEY,
            tecnico_id INT NOT NULL,
            veiculo_id INT,
            cliente_id INT,
            motivo TEXT NOT NULL,
            prioridade ENUM('baixa', 'normal', 'alta', 'urgente') DEFAULT 'normal',
            latitude DECIMAL(10, 8),
            longitude DECIMAL(11, 8),
            endereco TEXT,
            status ENUM('pendente', 'aprovada', 'negada') DEFAULT 'pendente',
            gestor_id INT,
            resposta_gestor TEXT,
            data_criacao TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            data_resposta TIMESTAMP NULL,
            INDEX idx_status (status),
            INDEX idx_tecnico (tecnico_id),
            INDEX idx_data_criacao (data_criacao)
        )";
        $pdo->exec($sql);
        echo "  ✓ Tabela solicitacoes_viagem criada<br>";
    }
    
    // 2. TABELA NOTIFICACOES_PUSH
    echo "<h3>2. Verificando tabela notificacoes_push...</h3>";
    
    $stmt = $pdo->query("SHOW TABLES LIKE 'notificacoes_push'");
    if ($stmt->rowCount() == 0) {
        echo "- Criando tabela notificacoes_push...<br>";
        $sql = "
        CREATE TABLE notificacoes_push (
            id INT AUTO_INCREMENT PRIMARY KEY,
            usuario_id INT NOT NULL,
            tipo ENUM('solicitacao_viagem', 'aprovacao_viagem', 'negacao_viagem') NOT NULL,
            titulo VARCHAR(255) NOT NULL,
            mensagem TEXT NOT NULL,
            dados_extras JSON,
            lida BOOLEAN DEFAULT FALSE,
            data_criacao TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            INDEX idx_usuario_lida (usuario_id, lida),
            INDEX idx_tipo (tipo),
            INDEX idx_data_criacao (data_criacao)
        )";
        $pdo->exec($sql);
        echo "  ✓ Tabela notificacoes_push criada<br>";
    } else {
        echo "✓ Tabela notificacoes_push já existe<br>";
    }
    
    // 3. TABELA FCM_TOKENS
    echo "<h3>3. Verificando tabela fcm_tokens...</h3>";
    
    $stmt = $pdo->query("SHOW TABLES LIKE 'fcm_tokens'");
    if ($stmt->rowCount() == 0) {
        echo "- Criando tabela fcm_tokens...<br>";
        $sql = "
        CREATE TABLE fcm_tokens (
            id INT AUTO_INCREMENT PRIMARY KEY,
            usuario_id INT NOT NULL,
            token VARCHAR(500) NOT NULL,
            dispositivo VARCHAR(255),
            data_criacao TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            data_atualizacao TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
            UNIQUE KEY unique_usuario_token (usuario_id, token(255)),
            INDEX idx_usuario (usuario_id)
        )";
        $pdo->exec($sql);
        echo "  ✓ Tabela fcm_tokens criada<br>";
    } else {
        echo "✓ Tabela fcm_tokens já existe<br>";
    }
    
    // 4. VERIFICAR TABELAS RELACIONADAS E CRIAR FKS APENAS SE EXISTIREM
    echo "<h3>4. Verificando e criando chaves estrangeiras...</h3>";
    
    // Verificar se as tabelas relacionadas existem
    $tabelasRelacionadas = ['tecnicos', 'veiculos', 'clientes'];
    $tabelasExistentes = [];
    
    foreach ($tabelasRelacionadas as $tabela) {
        $stmt = $pdo->query("SHOW TABLES LIKE '$tabela'");
        if ($stmt->rowCount() > 0) {
            $tabelasExistentes[] = $tabela;
            echo "✓ Tabela $tabela encontrada<br>";
        } else {
            echo "⚠ Tabela $tabela não encontrada - FK não será criada<br>";
        }
    }
    
    // Criar FKs apenas para tabelas que existem
    if (in_array('tecnicos', $tabelasExistentes)) {
        try {
            $pdo->exec("ALTER TABLE solicitacoes_viagem ADD CONSTRAINT fk_solicitacao_tecnico 
                       FOREIGN KEY (tecnico_id) REFERENCES tecnicos(id) ON DELETE CASCADE");
            echo "  ✓ FK para tecnicos criada<br>";
        } catch (PDOException $e) {
            echo "  ⚠ FK para tecnicos já existe ou erro: " . $e->getMessage() . "<br>";
        }
    }
    
    if (in_array('veiculos', $tabelasExistentes)) {
        try {
            $pdo->exec("ALTER TABLE solicitacoes_viagem ADD CONSTRAINT fk_solicitacao_veiculo 
                       FOREIGN KEY (veiculo_id) REFERENCES veiculos(id) ON DELETE SET NULL");
            echo "  ✓ FK para veiculos criada<br>";
        } catch (PDOException $e) {
            echo "  ⚠ FK para veiculos já existe ou erro: " . $e->getMessage() . "<br>";
        }
    }
    
    if (in_array('clientes', $tabelasExistentes)) {
        try {
            $pdo->exec("ALTER TABLE solicitacoes_viagem ADD CONSTRAINT fk_solicitacao_cliente 
                       FOREIGN KEY (cliente_id) REFERENCES clientes(id) ON DELETE SET NULL");
            echo "  ✓ FK para clientes criada<br>";
        } catch (PDOException $e) {
            echo "  ⚠ FK para clientes já existe ou erro: " . $e->getMessage() . "<br>";
        }
    }
    
    // FK para gestor (também na tabela tecnicos)
    if (in_array('tecnicos', $tabelasExistentes)) {
        try {
            $pdo->exec("ALTER TABLE solicitacoes_viagem ADD CONSTRAINT fk_solicitacao_gestor 
                       FOREIGN KEY (gestor_id) REFERENCES tecnicos(id) ON DELETE SET NULL");
            echo "  ✓ FK para gestor criada<br>";
        } catch (PDOException $e) {
            echo "  ⚠ FK para gestor já existe ou erro: " . $e->getMessage() . "<br>";
        }
    }
    
    // 5. INSERIR DADOS DE TESTE (apenas se não existirem)
    echo "<h3>5. Verificando dados de teste...</h3>";
    
    $stmt = $pdo->query("SELECT COUNT(*) FROM solicitacoes_viagem");
    $count = $stmt->fetchColumn();
    
    if ($count == 0) {
        echo "- Inserindo dados de teste...<br>";
        
        // Verificar se existem técnicos para usar como exemplo
        $stmt = $pdo->query("SELECT id FROM tecnicos LIMIT 1");
        $tecnico = $stmt->fetch();
        
        if ($tecnico) {
            $pdo->exec("
                INSERT INTO solicitacoes_viagem (
                    tecnico_id, motivo, prioridade, latitude, longitude, 
                    endereco, status
                ) VALUES (
                    {$tecnico['id']}, 
                    'Solicitação de teste - Viagem para manutenção preventiva',
                    'normal',
                    -23.5505,
                    -46.6333,
                    'São Paulo, SP - Brasil',
                    'pendente'
                )
            ");
            echo "  ✓ Solicitação de teste criada<br>";
        } else {
            echo "  ⚠ Nenhum técnico encontrado - dados de teste não inseridos<br>";
        }
    } else {
        echo "✓ Dados já existem na tabela ($count registros)<br>";
    }
    
    // 6. VERIFICAÇÃO FINAL
    echo "<h3>6. Verificação final do sistema...</h3>";
    
    $sql = "SELECT 'Tabelas do sistema de solicitações criadas com sucesso!' as status";
    $stmt = $pdo->query($sql);
    echo "✓ " . $stmt->fetchColumn() . "<br>";
    
    // Mostrar estrutura das tabelas
    echo "<h4>Estrutura das tabelas criadas:</h4>";
    
    echo "<strong>solicitacoes_viagem:</strong><br>";
    $stmt = $pdo->query("DESCRIBE solicitacoes_viagem");
    while ($row = $stmt->fetch()) {
        echo "- {$row['Field']}: {$row['Type']}<br>";
    }
    
    echo "<br><strong>notificacoes_push:</strong><br>";
    $stmt = $pdo->query("DESCRIBE notificacoes_push");
    while ($row = $stmt->fetch()) {
        echo "- {$row['Field']}: {$row['Type']}<br>";
    }
    
    echo "<br><strong>fcm_tokens:</strong><br>";
    $stmt = $pdo->query("DESCRIBE fcm_tokens");
    while ($row = $stmt->fetch()) {
        echo "- {$row['Field']}: {$row['Type']}<br>";
    }
    
    echo "<hr>";
    echo "<h3 style='color: green;'>✅ INSTALAÇÃO CONCLUÍDA COM SUCESSO!</h3>";
    echo "<p>O sistema de solicitações de viagem foi instalado/atualizado corretamente.</p>";
    echo "<p><a href='teste-sistema-solicitacoes.html'>→ Clique aqui para testar o sistema</a></p>";
    
} catch (PDOException $e) {
    echo "<h3 style='color: red;'>❌ ERRO na instalação:</h3>";
    echo "<p>Erro: " . $e->getMessage() . "</p>";
    echo "<p>Código: " . $e->getCode() . "</p>";
}
?> 
