-- ============================================
-- ATUALIZAÇÃO DA TABELA VEÍCULOS
-- Adição de campos para contratos
-- Data: 2025-01-26
-- ============================================

USE controle_frotas;

-- Verificar se as colunas já existem antes de adicionar
SET @exist_cliente_contrato = (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA = 'controle_frotas' 
    AND TABLE_NAME = 'veiculos' 
    AND COLUMN_NAME = 'cliente_contrato_id'
);

SET @exist_km_mensal = (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA = 'controle_frotas' 
    AND TABLE_NAME = 'veiculos' 
    AND COLUMN_NAME = 'km_mensal_contrato'
);

SET @exist_km_diario = (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA = 'controle_frotas' 
    AND TABLE_NAME = 'veiculos' 
    AND COLUMN_NAME = 'km_diario_contrato'
);

-- ============================================
-- ADICIONAR NOVAS COLUNAS NA TABELA VEÍCULOS
-- ============================================

-- 1. Cliente do contrato (FK para tabela clientes)
SET @sql_cliente = IF(@exist_cliente_contrato = 0, 
    'ALTER TABLE veiculos ADD COLUMN cliente_contrato_id INT NULL COMMENT "Cliente responsável pelo contrato do veículo"',
    'SELECT "Coluna cliente_contrato_id já existe" as msg'
);
PREPARE stmt_cliente FROM @sql_cliente;
EXECUTE stmt_cliente;
DEALLOCATE PREPARE stmt_cliente;

-- 2. KM mensal em contrato
SET @sql_km_mensal = IF(@exist_km_mensal = 0,
    'ALTER TABLE veiculos ADD COLUMN km_mensal_contrato INT NULL COMMENT "Limite de quilometragem mensal no contrato"',
    'SELECT "Coluna km_mensal_contrato já existe" as msg'
);
PREPARE stmt_km_mensal FROM @sql_km_mensal;
EXECUTE stmt_km_mensal;
DEALLOCATE PREPARE stmt_km_mensal;

-- 3. KM diário em contrato
SET @sql_km_diario = IF(@exist_km_diario = 0,
    'ALTER TABLE veiculos ADD COLUMN km_diario_contrato INT NULL COMMENT "Limite de quilometragem diária no contrato"',
    'SELECT "Coluna km_diario_contrato já existe" as msg'
);
PREPARE stmt_km_diario FROM @sql_km_diario;
EXECUTE stmt_km_diario;
DEALLOCATE PREPARE stmt_km_diario;

-- ============================================
-- ADICIONAR FOREIGN KEY PARA CLIENTES
-- ============================================

-- Verificar se a FK já existe
SET @fk_exists = (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    WHERE CONSTRAINT_SCHEMA = 'controle_frotas' 
    AND TABLE_NAME = 'veiculos' 
    AND CONSTRAINT_NAME = 'fk_veiculos_cliente_contrato'
);

-- Adicionar FK se não existir
SET @sql_fk = IF(@fk_exists = 0,
    'ALTER TABLE veiculos ADD CONSTRAINT fk_veiculos_cliente_contrato FOREIGN KEY (cliente_contrato_id) REFERENCES clientes(id) ON UPDATE CASCADE ON DELETE SET NULL',
    'SELECT "Foreign Key fk_veiculos_cliente_contrato já existe" as msg'
);
PREPARE stmt_fk FROM @sql_fk;
EXECUTE stmt_fk;
DEALLOCATE PREPARE stmt_fk;

-- ============================================
-- CRIAR ÍNDICES PARA PERFORMANCE
-- ============================================

-- Índice para cliente do contrato
SET @idx_cliente_exists = (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS 
    WHERE TABLE_SCHEMA = 'controle_frotas' 
    AND TABLE_NAME = 'veiculos' 
    AND INDEX_NAME = 'idx_cliente_contrato'
);

SET @sql_idx_cliente = IF(@idx_cliente_exists = 0,
    'CREATE INDEX idx_cliente_contrato ON veiculos(cliente_contrato_id)',
    'SELECT "Índice idx_cliente_contrato já existe" as msg'
);
PREPARE stmt_idx_cliente FROM @sql_idx_cliente;
EXECUTE stmt_idx_cliente;
DEALLOCATE PREPARE stmt_idx_cliente;

-- Índice para consulta por limites de contrato
SET @idx_contrato_exists = (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS 
    WHERE TABLE_SCHEMA = 'controle_frotas' 
    AND TABLE_NAME = 'veiculos' 
    AND INDEX_NAME = 'idx_limites_contrato'
);

SET @sql_idx_contrato = IF(@idx_contrato_exists = 0,
    'CREATE INDEX idx_limites_contrato ON veiculos(km_mensal_contrato, km_diario_contrato)',
    'SELECT "Índice idx_limites_contrato já existe" as msg'
);
PREPARE stmt_idx_contrato FROM @sql_idx_contrato;
EXECUTE stmt_idx_contrato;
DEALLOCATE PREPARE stmt_idx_contrato;

-- ============================================
-- VERIFICAÇÃO FINAL
-- ============================================

-- Mostrar estrutura atualizada da tabela veículos
SELECT 
    COLUMN_NAME as 'Coluna',
    DATA_TYPE as 'Tipo',
    IS_NULLABLE as 'Nulo',
    COLUMN_DEFAULT as 'Padrão',
    COLUMN_COMMENT as 'Comentário'
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = 'controle_frotas' 
AND TABLE_NAME = 'veiculos'
ORDER BY ORDINAL_POSITION;

-- Confirmar que as atualizações foram aplicadas
SELECT 
    'Atualização concluída!' as status,
    NOW() as data_execucao,
    'Campos de contrato adicionados na tabela veículos' as descricao;

-- ============================================
-- SCRIPT PARA POPULAR DADOS DE TESTE (OPCIONAL)
-- ============================================

-- Descomentar as linhas abaixo se quiser adicionar dados de teste

/*
-- Exemplo de atualização para veículos existentes
UPDATE veiculos SET 
    km_mensal_contrato = 2000,
    km_diario_contrato = 100,
    cliente_contrato_id = (SELECT id FROM clientes LIMIT 1)
WHERE id = 1;

-- Ver dados atualizados
SELECT 
    v.id,
    v.modelo,
    v.placa,
    c.nome as cliente_contrato,
    v.km_mensal_contrato,
    v.km_diario_contrato,
    v.status
FROM veiculos v
LEFT JOIN clientes c ON v.cliente_contrato_id = c.id
LIMIT 5;
*/ 