/**
 * SCRIPTS SQL - PROJEÇÃO DE VENDAS
 * 
 * Execude esses scripts apenas se quiser automatizar feriados no banco
 * Caso contrário, ignore este arquivo.
 */

-- ============================================================================
-- 1. CRIAR TABELA DE FERIADOS (run once)
-- ============================================================================

CREATE TABLE IF NOT EXISTS `back`.`feriados` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `data_feriado` DATE NOT NULL,
    `nome_feriado` VARCHAR(100) NOT NULL,
    `pais` VARCHAR(2) DEFAULT 'BR',
    `tipo` ENUM('federal', 'estadual', 'municipal', 'empresa') DEFAULT 'federal',
    `criado_em` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `atualizado_em` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY `uk_data_pais` (`data_feriado`, `pais`),
    INDEX `idx_pais_ano` (`pais`, YEAR(`data_feriado`))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================================
-- 2. FERIADOS BRASIL 2024
-- ============================================================================

INSERT INTO `back`.`feriados` (`data_feriado`, `nome_feriado`, `pais`, `tipo`) VALUES
-- 2024
('2024-01-01', 'Ano Novo', 'BR', 'federal'),
('2024-02-13', 'Terça de Carnaval', 'BR', 'federal'),
('2024-02-14', 'Quarta de Cinzas (até meio-dia)', 'BR', 'federal'),
('2024-03-29', 'Sexta-feira Santa', 'BR', 'federal'),
('2024-04-21', 'Tiradentes', 'BR', 'federal'),
('2024-05-01', 'Dia do Trabalho', 'BR', 'federal'),
('2024-05-30', 'Corpus Christi', 'BR', 'federal'),
('2024-09-07', 'Independência', 'BR', 'federal'),
('2024-10-12', 'Nossa Senhora Aparecida', 'BR', 'federal'),
('2024-11-02', 'Finados', 'BR', 'federal'),
('2024-11-15', 'Proclamação da República', 'BR', 'federal'),
('2024-11-20', 'Consciência Negra', 'BR', 'federal'),
('2024-12-25', 'Natal', 'BR', 'federal')
ON DUPLICATE KEY UPDATE nome_feriado = VALUES(nome_feriado);

-- ============================================================================
-- 3. FERIADOS BRASIL 2025
-- ============================================================================

INSERT INTO `back`.`feriados` (`data_feriado`, `nome_feriado`, `pais`, `tipo`) VALUES
-- 2025
('2025-01-01', 'Ano Novo', 'BR', 'federal'),
('2025-03-04', 'Terça de Carnaval', 'BR', 'federal'),
('2025-03-05', 'Quarta de Cinzas (até meio-dia)', 'BR', 'federal'),
('2025-04-18', 'Sexta-feira Santa', 'BR', 'federal'),
('2025-04-21', 'Tiradentes', 'BR', 'federal'),
('2025-05-01', 'Dia do Trabalho', 'BR', 'federal'),
('2025-06-19', 'Corpus Christi', 'BR', 'federal'),
('2025-09-07', 'Independência', 'BR', 'federal'),
('2025-10-12', 'Nossa Senhora Aparecida', 'BR', 'federal'),
('2025-11-02', 'Finados', 'BR', 'federal'),
('2025-11-15', 'Proclamação da República', 'BR', 'federal'),
('2025-11-20', 'Consciência Negra', 'BR', 'federal'),
('2025-12-25', 'Natal', 'BR', 'federal')
ON DUPLICATE KEY UPDATE nome_feriado = VALUES(nome_feriado);

-- ============================================================================
-- 4. FERIADOS BRASIL 2026
-- ============================================================================

INSERT INTO `back`.`feriados` (`data_feriado`, `nome_feriado`, `pais`, `tipo`) VALUES
-- 2026
('2026-01-01', 'Ano Novo', 'BR', 'federal'),
('2026-02-17', 'Terça de Carnaval', 'BR', 'federal'),
('2026-02-18', 'Quarta de Cinzas (até meio-dia)', 'BR', 'federal'),
('2026-04-10', 'Sexta-feira Santa', 'BR', 'federal'),
('2026-04-21', 'Tiradentes', 'BR', 'federal'),
('2026-05-01', 'Dia do Trabalho', 'BR', 'federal'),
('2026-06-04', 'Corpus Christi', 'BR', 'federal'),
('2026-09-07', 'Independência', 'BR', 'federal'),
('2026-10-12', 'Nossa Senhora Aparecida', 'BR', 'federal'),
('2026-11-02', 'Finados', 'BR', 'federal'),
('2026-11-15', 'Proclamação da República', 'BR', 'federal'),
('2026-11-20', 'Consciência Negra', 'BR', 'federal'),
('2026-12-25', 'Natal', 'BR', 'federal')
ON DUPLICATE KEY UPDATE nome_feriado = VALUES(nome_feriado);

-- ============================================================================
-- 5. FERIADOS BRASIL 2027
-- ============================================================================

INSERT INTO `back`.`feriados` (`data_feriado`, `nome_feriado`, `pais`, `tipo`) VALUES
-- 2027
('2027-01-01', 'Ano Novo', 'BR', 'federal'),
('2027-02-09', 'Terça de Carnaval', 'BR', 'federal'),
('2027-02-10', 'Quarta de Cinzas (até meio-dia)', 'BR', 'federal'),
('2027-04-02', 'Sexta-feira Santa', 'BR', 'federal'),
('2027-04-21', 'Tiradentes', 'BR', 'federal'),
('2027-05-01', 'Dia do Trabalho', 'BR', 'federal'),
('2027-05-27', 'Corpus Christi', 'BR', 'federal'),
('2027-09-07', 'Independência', 'BR', 'federal'),
('2027-10-12', 'Nossa Senhora Aparecida', 'BR', 'federal'),
('2027-11-02', 'Finados', 'BR', 'federal'),
('2027-11-15', 'Proclamação da República', 'BR', 'federal'),
('2027-11-20', 'Consciência Negra', 'BR', 'federal'),
('2027-12-25', 'Natal', 'BR', 'federal')
ON DUPLICATE KEY UPDATE nome_feriado = VALUES(nome_feriado);

-- ============================================================================
-- 6. CONSULTAS ÚTEIS
-- ============================================================================

-- Ver feriados de um mês
SELECT * FROM `back`.`feriados`
WHERE YEAR(data_feriado) = 2026
  AND MONTH(data_feriado) = 1
ORDER BY data_feriado;

-- Contar feriados por mês/ano
SELECT 
    MONTH(data_feriado) as mes,
    YEAR(data_feriado) as ano,
    COUNT(*) as qtd_feriados
FROM `back`.`feriados`
WHERE YEAR(data_feriado) = 2026
GROUP BY mes, ano
ORDER BY mes;

-- Feriados restantes neste mês
SELECT * FROM `back`.`feriados`
WHERE YEAR(data_feriado) = YEAR(CURDATE())
  AND MONTH(data_feriado) = MONTH(CURDATE())
  AND data_feriado > CURDATE()
ORDER BY data_feriado;

-- ============================================================================
-- 7. CRIAR CONFIG DE PESOS (OPCIONAL)
-- ============================================================================

CREATE TABLE IF NOT EXISTS `back`.`config_pesos_projecao` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `tipo_negocio` VARCHAR(50) NOT NULL UNIQUE,
    `peso_util` DECIMAL(4,2) DEFAULT 1.00,
    `peso_fds` DECIMAL(4,2) DEFAULT 1.25,
    `peso_feriado` DECIMAL(4,2) DEFAULT 1.35,
    `descricao` VARCHAR(200),
    `ativo` TINYINT DEFAULT 1,
    `criado_em` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `back`.`config_pesos_projecao` 
(`tipo_negocio`, `peso_util`, `peso_fds`, `peso_feriado`, `descricao`, `ativo`) VALUES
('varejo', 0.95, 1.50, 0.00, 'Loja física - Fins de semana vendem mais', 1),
('b2b', 1.20, 0.50, 0.20, 'Vendas B2B - Dias úteis são TOP', 1),
('saas', 1.00, 1.00, 1.00, 'SaaS/Assinatura - Todos dias iguais (24/7)', 1),
('varejo_online', 1.00, 1.40, 0.80, 'E-commerce - Fins de semana TOP', 1),
('servicos', 1.15, 0.60, 0.30, 'Serviços - Dias úteis primordiais', 1),
('custom', 1.00, 1.00, 1.00, 'Customizado - Ajuste conforme necessário', 1)
ON DUPLICATE KEY UPDATE peso_util = VALUES(peso_util), peso_fds = VALUES(peso_fds), peso_feriado = VALUES(peso_feriado);

-- ============================================================================
-- 8. QUERY PARA VERIFICAR CALENDÁRIO DO MÊS
-- ============================================================================

SELECT 
    DATE_FORMAT(CURDATE(), '%Y-%m') as mes_ano,
    
    -- Dias úteis (seg-sex)
    (SELECT COUNT(*) FROM (
        SELECT @d:= DATE_ADD(@start, INTERVAL n DAY) as data
        FROM (SELECT @start:= LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 1 MONTH)) + INTERVAL 1 DAY, @n:=0) init
        JOIN (SELECT 0 n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 
              UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 
              UNION SELECT 11 UNION SELECT 12 UNION SELECT 13 UNION SELECT 14 UNION SELECT 15 
              UNION SELECT 16 UNION SELECT 17 UNION SELECT 18 UNION SELECT 19 UNION SELECT 20 
              UNION SELECT 21 UNION SELECT 22 UNION SELECT 23 UNION SELECT 24 UNION SELECT 25
              UNION SELECT 26 UNION SELECT 27 UNION SELECT 28 UNION SELECT 29 UNION SELECT 30
              UNION SELECT 31) x
        WHERE MONTH(@d) = MONTH(CURDATE()) 
          AND YEAR(@d) = YEAR(CURDATE())
          AND DAYOFWEEK(@d) BETWEEN 2 AND 6
    ) uteis_count) as dias_uteis,
    
    -- Fins de semana
    (SELECT COUNT(*) FROM (
        SELECT @d2:= DATE_ADD(@start2, INTERVAL n DAY) as data
        FROM (SELECT @start2:= LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 1 MONTH)) + INTERVAL 1 DAY, @n2:=0) init
        JOIN (SELECT 0 n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 
              UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 
              UNION SELECT 11 UNION SELECT 12 UNION SELECT 13 UNION SELECT 14 UNION SELECT 15 
              UNION SELECT 16 UNION SELECT 17 UNION SELECT 18 UNION SELECT 19 UNION SELECT 20 
              UNION SELECT 21 UNION SELECT 22 UNION SELECT 23 UNION SELECT 24 UNION SELECT 25
              UNION SELECT 26 UNION SELECT 27 UNION SELECT 28 UNION SELECT 29 UNION SELECT 30
              UNION SELECT 31) x
        WHERE MONTH(@d2) = MONTH(CURDATE()) 
          AND YEAR(@d2) = YEAR(CURDATE())
          AND DAYOFWEEK(@d2) IN (1, 7)
    ) fds_count) as dias_fds,
    
    -- Feriados
    (SELECT COUNT(*) FROM `back`.`feriados`
     WHERE YEAR(data_feriado) = YEAR(CURDATE())
       AND MONTH(data_feriado) = MONTH(CURDATE())) as feriados,
    
    DAY(LAST_DAY(CURDATE())) as total_dias_mes;

-- ============================================================================
-- 9. VERIFICAR DADOS INSERIDOS
-- ============================================================================

-- Conferir quantos feriados temos por ano
SELECT 
    YEAR(data_feriado) as ano,
    COUNT(*) as total_feriados
FROM `back`.`feriados`
GROUP BY YEAR(data_feriado)
ORDER BY ano;

-- Ver próximos 5 feriados
SELECT * FROM `back`.`feriados`
WHERE data_feriado >= CURDATE()
ORDER BY data_feriado
LIMIT 5;
