<?php
require '../../conexao/conexao.php';
require '../querys_financeiro/forma-pagamento.php';
require '../querys_financeiro/movimento_caixa.php';
require '../querys_financeiro/categorias.php';

$movimentoCaixa = new MovimentoCaixa($connectionmysqlfinanceiro);
$formas_pagamento = new FormasPagamento($connectionmysqlfinanceiro);
$categorias = new Categorias($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');

$movimentos = $movimentoCaixa->listarMovimentos('', $mes, $ano);

$total_receitas = 0;
$total_despesas = 0;
$total_nao_operacional = 0;
$movimentos_nao_operacionais = [];
$movimentos_operacionais = [];

foreach ($movimentos as $movimento) {
    $categoria = $categorias->listarCategorias($movimento['id_categoria'])[0];
    // Calcula o valor real considerando o desconto e juros
    $valor_real = $movimento['valor'] - ($movimento['desconto'] ?? 0);

    // Adiciona juros ao valor real se existirem e o movimento estiver pago
    if (isset($movimento['juros']) && $movimento['juros'] > 0 && $movimento['pago'] == 'S') {
        $valor_real += $movimento['juros'];
    }

    if ($categoria['operacional'] === 'N') {
        $movimentos_nao_operacionais[] = [
            'movimento' => $movimento,
            'categoria' => $categoria
        ];
        if ($movimento['tipo'] == 'R') {
            $total_nao_operacional += $valor_real;
        } else {
            $total_nao_operacional -= $valor_real;
        }
    } else {
        $movimentos_operacionais[] = $movimento;
        if ($movimento['tipo'] == 'R') {
            $total_receitas += $valor_real;
        } else {
            $total_despesas += $valor_real;
        }
    }
}


// Configurar cabeçalho para download
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=Relatorio_Contas_' . $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'
];

$total_transferencias = 0;

// 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, ['']);
writeRow($output, [
    'Nome',
    'Tipo',
    'Categoria',
    'Data Vencimento',
    'Forma de Pagamento',
    'Parcelas',
    'Valor'
]);

// Receitas Operacionais
$totalOperacional = 0;

foreach ($movimentos_operacionais as $movimento) {
 $listarFormasPagamento = $formas_pagamento->listarFormasPagamento($movimento['id_forma_pagamento'])[0];
 $categoria = $categorias->listarCategorias($movimento['id_categoria'])[0];
 $subcategoria_nome = '';
if (!empty($movimento['id_subcategoria'])) {
$subcategorias = $categorias->listarSubcategorias($movimento['id_categoria'], $movimento['id_subcategoria']);
if (!empty($subcategorias)) {
  $subcategoria_nome = ' > ' . $subcategorias[0]['nome_subcategoria'];
  }
 }
 // Calcula o valor real considerando o desconto e juros
 $valor_real = $movimento['valor'] - ($movimento['desconto'] ?? 0);
  $juros = $movimento['juros'] ?? 0;
 // Adiciona juros ao valor real se existirem e o movimento estiver pago
if ($juros > 0 && $movimento['pago'] == 'S') {
  $valor_real += $juros;
 }
 $classe_movimento = $movimento['tipo'] == 'R' ? 'movimento-receita' : 'movimento-despesa';

    writeRow($output, [
        $movimento['nome'],
        $movimento['tipo'] == 'R' ? 'Receita' : 'Despesa',
        $categoria['nome'],
        $movimento['data'],
        $listarFormasPagamento['nome_forma_pagamento'],
        $movimento['n_parcela'],
        number_format($valor_real, 2, ',', '.')
    ]);
}

// 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);
