<?php
require '../../conexao/conexao.php';
require '../querys_financeiro/movimento_caixa.php';

$movimentoCaixa = new MovimentoCaixa($connectionmysqlfinanceiro);

// Pegar o mês e ano da URL
$mes = isset($_GET['mes']) ? $_GET['mes'] : date('m');
$ano = isset($_GET['ano']) ? $_GET['ano'] : date('Y');

$dataInicio = isset($_GET['data_inicio']) ? $_GET['data_inicio'] : date('Y-m-01');
$dataFim = isset($_GET['data_fim']) ? $_GET['data_fim'] : date('Y-m-t');

// Get movements for the date range
$movimentos = $movimentoCaixa->listarMovimentos('', '', '', $dataInicio, $dataFim);

// Initialize monthly totals
$totalMensalReceitas = 0;
$totalMensalDespesas = 0;
$totalMensalReceitasPagas = 0;
$totalMensalDespesasPagas = 0;
$totalMensalReceitasPendentes = 0;
$totalMensalDespesasPendentes = 0;

// Group movements by day
$movimentosPorDia = [];
foreach ($movimentos as $movimento) {
    $dia = date('Y-m-d', strtotime($movimento['data']));
    if (!isset($movimentosPorDia[$dia])) {
        $movimentosPorDia[$dia] = [
            'receitas' => 0,
            'despesas' => 0,
            'receitas_pagas' => 0,
            'receitas_pendentes' => 0,
            'despesas_pagas' => 0,
            'despesas_pendentes' => 0,
            'movimentos' => []
        ];
    }
    
    if ($movimento['tipo'] == 'R') {
        $valorComDesconto = $movimento['valor'] - ($movimento['desconto'] ?? 0);
        // Adicionar juros ao valor se existir e o movimento estiver pago
        $juros = ($movimento['juros'] ?? 0);
        $valorFinal = $valorComDesconto;
        if ($movimento['pago'] == 'S' && $juros > 0) {
            $valorFinal += $juros;
        }
        
        $movimentosPorDia[$dia]['receitas'] += $valorFinal;
        $totalMensalReceitas += $valorFinal;
        if ($movimento['pago'] == 'S') {
            $movimentosPorDia[$dia]['receitas_pagas'] += $valorFinal;
            $totalMensalReceitasPagas += $valorFinal;
        } else {
            $movimentosPorDia[$dia]['receitas_pendentes'] += $valorFinal;
            $totalMensalReceitasPendentes += $valorFinal;
        }
    } else {
        $valorComDesconto = $movimento['valor'] - ($movimento['desconto'] ?? 0);
        // Adicionar juros ao valor se existir e o movimento estiver pago
        $juros = ($movimento['juros'] ?? 0);
        $valorFinal = $valorComDesconto;
        if ($movimento['pago'] == 'S' && $juros > 0) {
            $valorFinal += $juros;
        }
        
        $movimentosPorDia[$dia]['despesas'] += $valorFinal;
        $totalMensalDespesas += $valorFinal;
        if ($movimento['pago'] == 'S') {
            $movimentosPorDia[$dia]['despesas_pagas'] += $valorFinal;
            $totalMensalDespesasPagas += $valorFinal;
        } else {
            $movimentosPorDia[$dia]['despesas_pendentes'] += $valorFinal;
            $totalMensalDespesasPendentes += $valorFinal;
        }
    }
    
    $movimentosPorDia[$dia]['movimentos'][] = $movimento;
}


// Configurar cabeçalho para download
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=Relatorio_fluxoa_dias_' . $mes . '_' . $ano . '.csv');

// Criar arquivo CSV
$output = fopen('php://output', 'w');

// Adicionar BOM para Excel reconhecer UTF-8
fprintf($output, chr(0xEF) . chr(0xBB) . chr(0xBF));

// Meses
$meses = [
    '01' => 'Janeiro',
    '02' => 'Fevereiro',
    '03' => 'Março',
    '04' => 'Abril',
    '05' => 'Maio',
    '06' => 'Junho',
    '07' => 'Julho',
    '08' => 'Agosto',
    '09' => 'Setembro',
    '10' => 'Outubro',
    '11' => 'Novembro',
    '12' => 'Dezembro'
];

// Função para escrever linha
function writeRow($output, $cells)
{
    // Converter números para o formato brasileiro
    $cells = array_map(function ($cell) {
        if (is_numeric($cell)) {
            return number_format($cell, 2, ',', '.');
        }
        return $cell;
    }, $cells);

    // Juntar células com ponto-e-vírgula e adicionar quebra de linha
    fwrite($output, implode(';', $cells) . "\r\n");
}


// Título e cabeçalhos
writeRow($output, ['Relatório de Contas']);
writeRow($output, [$meses[$mes] . '/' . $ano]);
writeRow($output, ['']);

foreach ($movimentosPorDia as $dia => $dados) {
    // Cabeçalho de data opcional (visualmente ajuda)
    writeRow($output, [$dia]); 

    // Totais do dia
    writeRow($output, [
        'Receitas',
        'Despesas',
        'Saldo Real',
        'Receitas Pagas',
        'Despesas Pagas',
        'Receitas Pendentes',
        'Despesas Pendentes'
    ]);

    $saldo_real = $dados['receitas_pagas'] - $dados['despesas_pagas'];

    writeRow($output, [
        number_format($dados['receitas'], 2, ',', '.'),
        number_format($dados['despesas'], 2, ',', '.'),
        number_format($saldo_real, 2, ',', '.'),
        number_format($dados['receitas_pagas'], 2, ',', '.'),
        number_format($dados['despesas_pagas'], 2, ',', '.'),
        number_format($dados['receitas_pendentes'], 2, ',', '.'),
        number_format($dados['despesas_pendentes'], 2, ',', '.')
    ]);

    // Espaço antes dos detalhes
    writeRow($output, ['']);

    // Cabeçalho do detalhamento com deslocamento
    writeRow($output, ['', '', 'Descrição', 'Tipo', 'Valor', 'Status']);

    foreach ($dados['movimentos'] as $movimento) {
        $valorFinal = ($movimento['valor'] - ($movimento['desconto'] ?? 0)) + ($movimento['juros'] ?? 0);

        writeRow($output, [
            '', '',
            $movimento['nome'],
            $movimento['tipo'] == 'R' ? 'Receita' : 'Despesa',
            number_format($valorFinal, 2, ',', '.'),
            $movimento['pago'] == 'S' ? 'Pago' : 'Pendente'
        ]);
    }

    // Linha em branco para separar os dias
    writeRow($output, ['']);
}

// Informações do Relatório
writeRow($output, ['Informações do Relatório']);
writeRow($output, ['Gerado em', date('d/m/Y H:i:s')]);
writeRow($output, ['Período', $meses[$mes] . '/' . $ano]);

fclose($output);
