-- ============================================================================
-- EXEMPLOS PRÁTICOS DE USO DO SISTEMA
-- ============================================================================

-- ============================================================================
-- CENÁRIO 1: Novo Usuário - Configuração Inicial Completa
-- ============================================================================

-- 1.1 Criar usuário
INSERT INTO usuarios (nome, email, senha_hash, tema_preferido) 
VALUES ('João Silva', 'joao@email.com', SHA2('senha123', 256), 'claro');

SET @usuario_id = LAST_INSERT_ID();

-- 1.2 Criar conta bancária principal
INSERT INTO contas_bancarias (
    usuario_id, instituicao_id, nome_conta, tipo_conta, 
    numero_conta, agencia, saldo_inicial, saldo_atual, 
    cor_identificacao, icone
) VALUES (
    @usuario_id, 
    (SELECT id FROM instituicoes_financeiras WHERE nome = 'Nubank'), 
    'Nubank Principal', 
    'corrente',
    '1234567',
    '0001',
    2500.00,
    2500.00,
    '#820AD1',
    'credit-card'
);

SET @conta_principal = LAST_INSERT_ID();

-- 1.3 Criar conta poupança
INSERT INTO contas_bancarias (
    usuario_id, instituicao_id, nome_conta, tipo_conta, 
    saldo_inicial, saldo_atual, cor_identificacao
) VALUES (
    @usuario_id,
    (SELECT id FROM instituicoes_financeiras WHERE nome = 'Banco Inter'),
    'Inter Poupança',
    'poupanca',
    5000.00,
    5000.00,
    '#FF7A00'
);

SET @conta_poupanca = LAST_INSERT_ID();

-- 1.4 Criar cartão de crédito
INSERT INTO cartoes_credito (
    usuario_id, instituicao_id, nome_cartao, bandeira,
    numero_final, limite_total, limite_disponivel,
    dia_vencimento, dia_fechamento, cor_identificacao
) VALUES (
    @usuario_id,
    (SELECT id FROM instituicoes_financeiras WHERE nome = 'Nubank'),
    'Nubank Mastercard',
    'mastercard',
    '4321',
    8000.00,
    8000.00,
    15,
    5,
    '#820AD1'
);

SET @cartao_principal = LAST_INSERT_ID();

-- ============================================================================
-- CENÁRIO 2: Registrar Salário Mensal
-- ============================================================================

INSERT INTO transacoes (
    usuario_id, tipo, descricao, valor, data_transacao,
    categoria_id, conta_origem_id, status
) VALUES (
    @usuario_id,
    'receita',
    'Salário Mensal - Fevereiro/2026',
    5500.00,
    '2026-02-05',
    (SELECT id FROM categorias WHERE nome = 'Salário' AND tipo = 'receita'),
    @conta_principal,
    'pago'
);

-- Atualizar saldo da conta
CALL sp_calcular_saldo_conta(@conta_principal);

-- ============================================================================
-- CENÁRIO 3: Pagar Contas Fixas do Mês
-- ============================================================================

-- 3.1 Aluguel
INSERT INTO transacoes (
    usuario_id, tipo, descricao, valor, data_transacao,
    categoria_id, 
    subcategoria_id,
    conta_origem_id, status, recorrente, frequencia_recorrencia
) VALUES (
    @usuario_id,
    'despesa',
    'Aluguel Fevereiro/2026',
    1200.00,
    '2026-02-10',
    (SELECT id FROM categorias WHERE nome = 'Moradia' AND tipo = 'despesa'),
    (SELECT id FROM subcategorias WHERE nome = 'Aluguel'),
    @conta_principal,
    'pago',
    TRUE,
    'mensal'
);

-- 3.2 Condomínio
INSERT INTO transacoes (
    usuario_id, tipo, descricao, valor, data_transacao,
    categoria_id, subcategoria_id, conta_origem_id, status,
    recorrente, frequencia_recorrencia
) VALUES (
    @usuario_id,
    'despesa',
    'Condomínio Fevereiro/2026',
    350.00,
    '2026-02-10',
    (SELECT id FROM categorias WHERE nome = 'Moradia' AND tipo = 'despesa'),
    (SELECT id FROM subcategorias WHERE nome = 'Condomínio'),
    @conta_principal,
    'pago',
    TRUE,
    'mensal'
);

-- 3.3 Internet
INSERT INTO transacoes (
    usuario_id, tipo, descricao, valor, data_transacao,
    categoria_id, subcategoria_id, conta_origem_id, status,
    recorrente, frequencia_recorrencia
) VALUES (
    @usuario_id,
    'despesa',
    'Internet - 500MB Fibra',
    99.90,
    '2026-02-15',
    (SELECT id FROM categorias WHERE nome = 'Moradia' AND tipo = 'despesa'),
    (SELECT id FROM subcategorias WHERE nome = 'Internet'),
    @conta_principal,
    'pago',
    TRUE,
    'mensal'
);

-- Atualizar saldo
CALL sp_calcular_saldo_conta(@conta_principal);

-- ============================================================================
-- CENÁRIO 4: Compra Parcelada no Cartão
-- ============================================================================

-- Compra de notebook parcelado em 12x
CALL sp_registrar_transacao(
    @usuario_id,           -- usuario_id
    'despesa',             -- tipo
    'Notebook Dell Inspiron',  -- descricao
    3600.00,              -- valor
    '2026-02-12',         -- data_transacao
    (SELECT id FROM categorias WHERE nome = 'Educação' AND tipo = 'despesa'),  -- categoria_id
    NULL,                  -- subcategoria_id
    NULL,                  -- conta_origem_id (não usa conta, é no cartão)
    NULL,                  -- conta_destino_id
    @cartao_principal,     -- cartao_credito_id
    'pago',               -- status
    12,                   -- numero_parcelas
    @transacao_id         -- OUT parameter
);

-- Atualizar limite do cartão
CALL sp_atualizar_limite_cartao(@cartao_principal);

-- ============================================================================
-- CENÁRIO 5: Despesas Diárias
-- ============================================================================

-- 5.1 Supermercado
INSERT INTO transacoes (
    usuario_id, tipo, descricao, valor, data_transacao,
    categoria_id, subcategoria_id, cartao_credito_id, status
) VALUES (
    @usuario_id,
    'despesa',
    'Compras no Supermercado',
    287.50,
    '2026-02-13',
    (SELECT id FROM categorias WHERE nome = 'Alimentação' AND tipo = 'despesa'),
    (SELECT id FROM subcategorias WHERE nome = 'Supermercado'),
    @cartao_principal,
    'pago'
);

-- 5.2 Combustível
INSERT INTO transacoes (
    usuario_id, tipo, descricao, valor, data_transacao,
    categoria_id, subcategoria_id, conta_origem_id, status
) VALUES (
    @usuario_id,
    'despesa',
    'Abastecimento - Posto Shell',
    150.00,
    '2026-02-14',
    (SELECT id FROM categorias WHERE nome = 'Transporte' AND tipo = 'despesa'),
    (SELECT id FROM subcategorias WHERE nome = 'Combustível'),
    @conta_principal,
    'pago'
);

-- 5.3 Restaurante
INSERT INTO transacoes (
    usuario_id, tipo, descricao, valor, data_transacao,
    categoria_id, subcategoria_id, cartao_credito_id, status
) VALUES (
    @usuario_id,
    'despesa',
    'Jantar - Restaurante Italiano',
    125.00,
    '2026-02-14',
    (SELECT id FROM categorias WHERE nome = 'Alimentação' AND tipo = 'despesa'),
    (SELECT id FROM subcategorias WHERE nome = 'Restaurantes'),
    @cartao_principal,
    'pago'
);

-- ============================================================================
-- CENÁRIO 6: Transferência Entre Contas
-- ============================================================================

INSERT INTO transacoes (
    usuario_id, tipo, descricao, valor, data_transacao,
    conta_origem_id, conta_destino_id, status
) VALUES (
    @usuario_id,
    'transferencia',
    'Aplicação na Poupança',
    1000.00,
    '2026-02-15',
    @conta_principal,
    @conta_poupanca,
    'pago'
);

-- Atualizar ambas as contas
CALL sp_calcular_saldo_conta(@conta_principal);
CALL sp_calcular_saldo_conta(@conta_poupanca);

-- ============================================================================
-- CENÁRIO 7: Criar Orçamento Mensal
-- ============================================================================

-- 7.1 Orçamento para Alimentação
INSERT INTO orcamentos (
    usuario_id, categoria_id, nome, valor_planejado,
    mes_referencia, ano_referencia, alerta_percentual
) VALUES (
    @usuario_id,
    (SELECT id FROM categorias WHERE nome = 'Alimentação' AND tipo = 'despesa'),
    'Alimentação Fevereiro/2026',
    800.00,
    2,
    2026,
    80
);

-- 7.2 Orçamento para Transporte
INSERT INTO orcamentos (
    usuario_id, categoria_id, nome, valor_planejado,
    mes_referencia, ano_referencia, alerta_percentual
) VALUES (
    @usuario_id,
    (SELECT id FROM categorias WHERE nome = 'Transporte' AND tipo = 'despesa'),
    'Transporte Fevereiro/2026',
    500.00,
    2,
    2026,
    80
);

-- 7.3 Orçamento para Lazer
INSERT INTO orcamentos (
    usuario_id, categoria_id, nome, valor_planejado,
    mes_referencia, ano_referencia, alerta_percentual
) VALUES (
    @usuario_id,
    (SELECT id FROM categorias WHERE nome = 'Lazer' AND tipo = 'despesa'),
    'Lazer Fevereiro/2026',
    400.00,
    2,
    2026,
    80
);

-- ============================================================================
-- CENÁRIO 8: Criar Metas Financeiras
-- ============================================================================

-- 8.1 Meta: Reserva de Emergência
INSERT INTO metas_financeiras (
    usuario_id, nome, descricao, valor_alvo, valor_atual,
    conta_destino_id, data_inicio, data_alvo,
    categoria_meta, prioridade, valor_mensal_sugerido
) VALUES (
    @usuario_id,
    'Reserva de Emergência',
    'Guardar 6 meses de despesas (R$ 3.000/mês)',
    18000.00,
    5000.00,
    @conta_poupanca,
    '2026-02-01',
    '2026-12-31',
    'reserva_emergencia',
    'urgente',
    1300.00
);

-- 8.2 Meta: Viagem de Férias
INSERT INTO metas_financeiras (
    usuario_id, nome, descricao, valor_alvo, valor_atual,
    conta_destino_id, data_inicio, data_alvo,
    categoria_meta, prioridade, valor_mensal_sugerido
) VALUES (
    @usuario_id,
    'Viagem Europa',
    'Viagem de 15 dias para Europa',
    12000.00,
    0.00,
    @conta_poupanca,
    '2026-02-01',
    '2026-11-30',
    'viagem',
    'media',
    1200.00
);

-- 8.3 Meta: Curso de Especialização
INSERT INTO metas_financeiras (
    usuario_id, nome, descricao, valor_alvo, valor_atual,
    data_inicio, data_alvo, categoria_meta, prioridade
) VALUES (
    @usuario_id,
    'MBA em Gestão',
    'Curso de MBA na FGV',
    8000.00,
    1000.00,
    '2026-02-01',
    '2026-08-31',
    'educacao',
    'alta'
);

-- ============================================================================
-- CENÁRIO 9: Agendar Contas Futuras
-- ============================================================================

-- 9.1 Agendar pagamento de IPTU parcelado
INSERT INTO transacoes (
    usuario_id, tipo, descricao, valor, data_transacao, data_vencimento,
    categoria_id, subcategoria_id, conta_origem_id, status
) VALUES 
    (@usuario_id, 'despesa', 'IPTU 2026 - Parcela 1/10', 180.00, '2026-03-10', '2026-03-10',
     (SELECT id FROM categorias WHERE nome = 'Moradia' AND tipo = 'despesa'),
     (SELECT id FROM subcategorias WHERE nome = 'IPTU'),
     @conta_principal, 'agendado'),
    (@usuario_id, 'despesa', 'IPTU 2026 - Parcela 2/10', 180.00, '2026-04-10', '2026-04-10',
     (SELECT id FROM categorias WHERE nome = 'Moradia' AND tipo = 'despesa'),
     (SELECT id FROM subcategorias WHERE nome = 'IPTU'),
     @conta_principal, 'agendado'),
    (@usuario_id, 'despesa', 'IPTU 2026 - Parcela 3/10', 180.00, '2026-05-10', '2026-05-10',
     (SELECT id FROM categorias WHERE nome = 'Moradia' AND tipo = 'despesa'),
     (SELECT id FROM subcategorias WHERE nome = 'IPTU'),
     @conta_principal, 'agendado');

-- 9.2 Agendar seguro do carro
INSERT INTO transacoes (
    usuario_id, tipo, descricao, valor, data_transacao, data_vencimento,
    categoria_id, conta_origem_id, status
) VALUES (
    @usuario_id,
    'despesa',
    'Seguro do Veículo 2026',
    2400.00,
    '2026-03-15',
    '2026-03-15',
    (SELECT id FROM categorias WHERE nome = 'Seguros' AND tipo = 'despesa'),
    @conta_principal,
    'agendado'
);

-- ============================================================================
-- CENÁRIO 10: Adicionar Assinaturas Recorrentes
-- ============================================================================

-- 10.1 Netflix
INSERT INTO transacoes (
    usuario_id, tipo, descricao, valor, data_transacao,
    categoria_id, subcategoria_id, cartao_credito_id, status,
    recorrente, frequencia_recorrencia
) VALUES (
    @usuario_id,
    'despesa',
    'Netflix - Plano Premium',
    55.90,
    '2026-02-20',
    (SELECT id FROM categorias WHERE nome = 'Assinaturas' AND tipo = 'despesa'),
    (SELECT id FROM subcategorias WHERE nome = 'Streaming (Netflix, etc)'),
    @cartao_principal,
    'pago',
    TRUE,
    'mensal'
);

-- 10.2 Spotify
INSERT INTO transacoes (
    usuario_id, tipo, descricao, valor, data_transacao,
    categoria_id, subcategoria_id, cartao_credito_id, status,
    recorrente, frequencia_recorrencia
) VALUES (
    @usuario_id,
    'despesa',
    'Spotify Premium',
    21.90,
    '2026-02-22',
    (SELECT id FROM categorias WHERE nome = 'Assinaturas' AND tipo = 'despesa'),
    (SELECT id FROM subcategorias WHERE nome = 'Música (Spotify, etc)'),
    @cartao_principal,
    'pago',
    TRUE,
    'mensal'
);

-- 10.3 Academia
INSERT INTO transacoes (
    usuario_id, tipo, descricao, valor, data_transacao,
    categoria_id, subcategoria_id, conta_origem_id, status,
    recorrente, frequencia_recorrencia
) VALUES (
    @usuario_id,
    'despesa',
    'Academia Smart Fit',
    89.90,
    '2026-02-25',
    (SELECT id FROM categorias WHERE nome = 'Saúde' AND tipo = 'despesa'),
    (SELECT id FROM subcategorias WHERE nome = 'Academia'),
    @conta_principal,
    'pago',
    TRUE,
    'mensal'
);

-- ============================================================================
-- CENÁRIO 11: Consultar Informações
-- ============================================================================

-- 11.1 Ver saldo atual de todas as contas
SELECT * FROM vw_resumo_contas WHERE usuario_id = @usuario_id;

-- 11.2 Ver status dos cartões
SELECT * FROM vw_resumo_cartoes WHERE usuario_id = @usuario_id;

-- 11.3 Ver transações do mês
SELECT * FROM vw_transacoes_detalhadas 
WHERE usuario_id = @usuario_id 
  AND MONTH(data_transacao) = MONTH(CURDATE())
  AND YEAR(data_transacao) = YEAR(CURDATE())
ORDER BY data_transacao DESC;

-- 11.4 Ver fluxo de caixa
SELECT * FROM vw_fluxo_caixa_mensal 
WHERE usuario_id = @usuario_id 
ORDER BY ano DESC, mes DESC 
LIMIT 6;

-- 11.5 Ver progresso do orçamento
SELECT * FROM vw_orcamento_realizado 
WHERE usuario_id = @usuario_id
  AND mes_referencia = MONTH(CURDATE())
  AND ano_referencia = YEAR(CURDATE());

-- 11.6 Ver progresso das metas
SELECT * FROM vw_progresso_metas 
WHERE usuario_id = @usuario_id 
  AND status = 'em_progresso';

-- ============================================================================
-- CENÁRIO 12: Gerar Faturas do Cartão
-- ============================================================================

-- Gerar faturas de fevereiro/2026
CALL sp_gerar_faturas_mes(@usuario_id, 2, 2026);

-- Fechar fatura específica
SET @fatura_id = (SELECT id FROM faturas_cartao 
                  WHERE cartao_credito_id = @cartao_principal 
                    AND mes_referencia = 2 
                    AND ano_referencia = 2026);

CALL sp_fechar_fatura(@fatura_id);

-- ============================================================================
-- CENÁRIO 13: Criar Notificações
-- ============================================================================

-- 13.1 Notificação de vencimento próximo
INSERT INTO notificacoes (
    usuario_id, tipo, titulo, mensagem, 
    referencia_tipo, referencia_id, prioridade
) VALUES (
    @usuario_id,
    'vencimento',
    'Conta a Vencer',
    'Fatura do cartão Nubank vence em 3 dias (R$ 762,80)',
    'fatura',
    @fatura_id,
    'alta'
);

-- 13.2 Notificação de orçamento
INSERT INTO notificacoes (
    usuario_id, tipo, titulo, mensagem, prioridade
) VALUES (
    @usuario_id,
    'orcamento',
    'Alerta de Orçamento',
    'Você já gastou 85% do orçamento de Alimentação deste mês',
    'media'
);

-- 13.3 Notificação de meta
INSERT INTO notificacoes (
    usuario_id, tipo, titulo, mensagem, prioridade
) VALUES (
    @usuario_id,
    'meta',
    'Meta Atingida!',
    'Parabéns! Você atingiu 50% da meta "Reserva de Emergência"',
    'baixa'
);

-- ============================================================================
-- CENÁRIO 14: Configurações Personalizadas
-- ============================================================================

-- 14.1 Configurar moeda padrão
INSERT INTO configuracoes_sistema (usuario_id, chave, valor, tipo_dado)
VALUES (@usuario_id, 'moeda_padrao', 'BRL', 'string');

-- 14.2 Configurar primeiro dia da semana
INSERT INTO configuracoes_sistema (usuario_id, chave, valor, tipo_dado)
VALUES (@usuario_id, 'primeiro_dia_semana', 'segunda', 'string');

-- 14.3 Configurar notificações
INSERT INTO configuracoes_sistema (usuario_id, chave, valor, tipo_dado)
VALUES (@usuario_id, 'notificar_vencimentos', 'true', 'boolean');

-- 14.4 Dias de antecedência para notificações
INSERT INTO configuracoes_sistema (usuario_id, chave, valor, tipo_dado)
VALUES (@usuario_id, 'dias_antecedencia_notificacao', '3', 'integer');

-- ============================================================================
-- FIM DOS EXEMPLOS
-- ============================================================================

SELECT 'Exemplos executados com sucesso!' AS Status;
SELECT CONCAT('Usuário criado com ID: ', @usuario_id) AS Info;
