<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class financeiro extends MX_Controller {

    public function __construct()
    {
        parent::__construct();
        $this->auth->check_session();
        $this->load->model('financeiro_model');
        $this->load->model('clients_model');
        $this->load->model('cases_model');
        $this->load->model('employees_model');
        $this->load->model('setting_model');
        $this->load->helper('url');
    }

    // ── DASHBOARD ─────────────────────────────────────────────
    public function index()
    {
        $data_ini = $this->input->get('data_ini') ?: date('Y-m-01');
        $data_fim = $this->input->get('data_fim') ?: date('Y-m-t');

        $data['contas']          = $this->financeiro_model->get_contas();
        $data['contas_clientes'] = $this->clients_model->get_all_clients();
        $data['totais']          = $this->financeiro_model->get_totais_mes($data_ini, $data_fim);
        $data['a_pagar']         = $this->financeiro_model->get_lancamentos_periodo('pagar',    $data_ini, $data_fim);
        $data['a_receber']       = $this->financeiro_model->get_lancamentos_periodo('receber',  $data_ini, $data_fim);
        $data['vencidos']        = $this->financeiro_model->get_vencidos();
        $data['data_ini']        = $data_ini;
        $data['data_fim']        = $data_fim;
        $data['page_title']      = 'Financeiro';
        $data['body']            = 'financeiro/index';
        $this->load->view('template/main', $data);
    }

    // ── LANÇAMENTOS ───────────────────────────────────────────
    public function lancamentos($tipo = null)
    {
        $filtros = [
            'tipo'      => $tipo ?: $this->input->get('tipo'),
            'conta_id'  => $this->input->get('conta_id'),
            'status'    => $this->input->get('status'),
            'data_ini'  => $this->input->get('data_ini') ?: date('Y-m-d', strtotime('-180 days')),
            'data_fim'  => $this->input->get('data_fim') ?: date('Y-m-t'),
            'client_id' => $this->input->get('client_id') ?: null,
        ];

        $data['lancamentos']     = $this->financeiro_model->get_lancamentos($filtros);
        $data['contas']          = $this->financeiro_model->get_contas();
        $data['contas_clientes'] = $this->clients_model->get_all_clients();
        $data['categorias']      = $this->financeiro_model->get_categorias($filtros['tipo']);
        $data['clientes']        = $this->clients_model->get_all_clients();
        $data['totais']          = $this->financeiro_model->get_totais($filtros);
        $data['filtros']         = $filtros;
        $data['tipo']            = $filtros['tipo'];
        $data['page_title']      = $tipo === 'receber' ? 'Contas a Receber' : ($tipo === 'pagar' ? 'Contas a Pagar' : 'Lançamentos');
        $data['body']            = 'financeiro/lancamentos';
        $this->load->view('template/main', $data);
    }

    // ── ADD/EDIT LANÇAMENTO ───────────────────────────────────
    // CORREÇÃO itens 1 e 2: status pendente funcionando corretamente
    public function add_lancamento($id = 0)
    {
        if ($this->input->post('submitted')) {
            $valor = (float) str_replace(['.', ','], ['', '.'], $this->input->post('valor'));
            $status          = $this->input->post('status') ?: 'pendente';
            $data_pagamento  = $this->input->post('data_pagamento');

            // Se informou data de pagamento, força status pago
            // Se status for pendente, limpa a data de pagamento
            if ($data_pagamento && $status === 'pago') {
                $status = 'pago';
            } elseif ($status === 'pendente') {
                $data_pagamento = null; // Garante que pendente não salva data
            }

            $dados = [
                'tipo'             => $this->input->post('tipo'),
                'conta_id'         => $this->input->post('conta_id') ?: null,
                'categoria'        => $this->input->post('categoria'),
                'subcategoria'     => $this->input->post('subcategoria'),
                'descricao'        => $this->input->post('descricao'),
                'fornecedor'       => $this->input->post('fornecedor'),
                'valor'            => $valor,
                'vencimento'       => $this->input->post('vencimento'),
                'competencia_mes'  => $this->input->post('competencia_mes'),
                'forma_pagamento'  => $this->input->post('forma_pagamento'),
                'numero_documento' => $this->input->post('numero_documento'),
                'client_id'        => $this->input->post('client_id') ?: null,
                'case_id'          => $this->input->post('case_id') ?: null,
                'responsavel_id'   => $this->input->post('responsavel_id') ?: null,
                'observacao'       => $this->input->post('observacao'),
                'status'           => $status,
                'data_pagamento'   => $data_pagamento ?: null,
            ];

            if ($id > 0) {
                $this->financeiro_model->update_lancamento($id, $dados);
                if (!empty($dados['conta_id'])) {
                    $this->financeiro_model->atualizar_saldo_conta($dados['conta_id']);
                }
                $this->session->set_flashdata('message', 'Lançamento atualizado com sucesso.');
            } else {
                $dados['created_by'] = $this->session->userdata('id');
                $dados['created_at'] = date('Y-m-d H:i:s');
                $new_id = $this->financeiro_model->add_lancamento($dados);
                if (!empty($dados['conta_id'])) {
                    $this->financeiro_model->atualizar_saldo_conta($dados['conta_id']);
                }
                $this->session->set_flashdata('message', 'Lançamento registrado com sucesso.');
            }
            
if ($this->input->post('recorrente') && $new_id) {
    $tipo_rec  = $this->input->post('recorrencia_tipo') ?: 'mensal';
    $total_rec = (int)$this->input->post('recorrencia_total') ?: 12;

    // Intervalos em meses por tipo
    $intervalos = [
        'mensal'     => 1,
        'bimestral'  => 2,
        'trimestral' => 3,
        'semestral'  => 6,
        'anual'      => 12,
    ];
    $meses = $intervalos[$tipo_rec] ?? 1;

    // Atualiza o lançamento pai com flag recorrente
    $this->financeiro_model->update_lancamento($new_id, [
        'recorrente'        => 1,
        'recorrencia_tipo'  => $tipo_rec,
        'recorrencia_total' => $total_rec,
        'recorrencia_seq'   => 1,
    ]);

    // Gera as próximas parcelas
    $limite = $total_rec > 0 ? $total_rec - 1 : 11; // máx 12 geradas de uma vez se indeterminado
    for ($i = 1; $i <= $limite; $i++) {
        $nova_data = date('Y-m-d', strtotime($dados['vencimento'] . ' +' . ($i * $meses) . ' months'));
        $parcela = array_merge($dados, [
            'vencimento'        => $nova_data,
            'status'            => 'pendente',
            'data_pagamento'    => null,
            'recorrente'        => 1,
            'recorrencia_tipo'  => $tipo_rec,
            'recorrencia_total' => $total_rec,
            'recorrencia_pai'   => $new_id,
            'recorrencia_seq'   => $i + 1,
            'created_at'        => date('Y-m-d H:i:s'),
        ]);
        $this->financeiro_model->add_lancamento($parcela);
    }
}

            $tipo = $this->input->post('tipo') ?: 'receber';
            redirect('admin/financeiro/lancamentos/' . $tipo);
        }

        $lancamento          = $id > 0 ? $this->financeiro_model->get_lancamento($id) : null;
        $data['lancamento']  = $lancamento;
        $data['contas']      = $this->financeiro_model->get_contas();
        $data['contas_clientes'] = $this->clients_model->get_all_clients();
        $data['categorias']  = $this->financeiro_model->get_categorias();
        $data['clientes']    = $this->clients_model->get_all_clients();
        $data['advogados']   = $this->employees_model->get_all();
        $data['tipo_pre']    = $this->input->get('tipo') ?: ($lancamento->tipo ?? 'receber');
        $data['page_title']  = $id > 0 ? 'Editar Lançamento' : 'Novo Lançamento';
        $data['body']        = 'financeiro/add_lancamento';
        $this->load->view('template/main', $data);
    }

    // ── BAIXAR ────────────────────────────────────────────────
    public function baixar($id = 0)
    {
        if (!$id) redirect('admin/financeiro');
        $dados = [
            'status'         => 'pago',
            'data_pagamento' => $this->input->post('data_pagamento') ?: date('Y-m-d'),
            'updated_at'     => date('Y-m-d H:i:s'),
        ];
        $this->financeiro_model->update_lancamento($id, $dados);
        $lanc = $this->financeiro_model->get_lancamento($id);
        if ($lanc && $lanc->conta_id) {
            $this->financeiro_model->atualizar_saldo_conta($lanc->conta_id);
        }
        $this->session->set_flashdata('message', 'Baixa registrada com sucesso.');
        $ref = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : site_url('admin/financeiro');
        redirect($ref);
    }

    // ── DELETE ────────────────────────────────────────────────
    public function delete_lancamento($id = 0)
    {
        if (!$id) redirect('admin/financeiro');
        $lanc = $this->financeiro_model->get_lancamento($id);
        $this->db->where('id', $id)->delete('fin_lancamentos');
        if ($lanc && $lanc->conta_id) {
            $this->financeiro_model->atualizar_saldo_conta($lanc->conta_id);
        }
        $this->session->set_flashdata('message', 'Lançamento excluído.');
        $ref = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : site_url('admin/financeiro');
        redirect($ref);
    }

    // ── CONTAS ────────────────────────────────────────────────
    public function contas()
    {
        if ($this->input->post('submitted')) {
            $dados = [
                'nome'          => $this->input->post('nome'),
                'banco'         => $this->input->post('banco'),
                'tipo'          => $this->input->post('tipo'),
                'saldo_inicial' => (float)str_replace(['.', ','], ['', '.'], $this->input->post('saldo_inicial')),
                'saldo_atual'   => (float)str_replace(['.', ','], ['', '.'], $this->input->post('saldo_inicial')),
                'cor'           => $this->input->post('cor') ?: '#3c8dbc',
            ];
            $id = (int)$this->input->post('id');
            if ($id > 0) $this->db->where('id', $id)->update('fin_contas', $dados);
            else $this->db->insert('fin_contas', $dados);
            $this->session->set_flashdata('message', 'Conta salva.');
            redirect('admin/financeiro/contas');
        }
        $data['contas']     = $this->financeiro_model->get_contas();
        $data['page_title'] = 'Contas Bancárias';
        $data['body']       = 'financeiro/contas';
        $this->load->view('template/main', $data);
    }

    public function delete_conta($id = 0)
    {
        $this->db->where('id', $id)->update('fin_contas', ['ativo' => 0]);
        redirect('admin/financeiro/contas');
    }

    // ── TRANSFERÊNCIAS ────────────────────────────────────────
    public function transferencias()
    {
        if ($this->input->post('submitted')) {
            $valor = (float)str_replace(['.', ','], ['', '.'], $this->input->post('valor'));
            $dados = [
                'conta_origem_id'    => $this->input->post('conta_origem_id'),
                'conta_destino_id'   => $this->input->post('conta_destino_id'),
                'valor'              => $valor,
                'data_transferencia' => $this->input->post('data_transferencia') ?: date('Y-m-d'),
                'descricao'          => $this->input->post('descricao'),
                'created_by'         => $this->session->userdata('id'),
            ];
            $this->db->insert('fin_transferencias', $dados);
            $this->financeiro_model->atualizar_saldo_conta($dados['conta_origem_id']);
            $this->financeiro_model->atualizar_saldo_conta($dados['conta_destino_id']);
            $this->session->set_flashdata('message', 'Transferência registrada.');
            redirect('admin/financeiro/transferencias');
        }
        $data['transferencias'] = $this->financeiro_model->get_transferencias();
        $data['contas']         = $this->financeiro_model->get_contas();
        $data['page_title']     = 'Transferências entre Contas';
        $data['body']           = 'financeiro/transferencias';
        $this->load->view('template/main', $data);
    }

    // ── CATEGORIAS ────────────────────────────────────────────
    public function categorias()
    {
        if ($this->input->post('submitted')) {
            $dados = ['nome' => $this->input->post('nome'), 'tipo' => $this->input->post('tipo')];
            $id = (int)$this->input->post('id');
            if ($id > 0) $this->db->where('id', $id)->update('fin_categorias', $dados);
            else $this->db->insert('fin_categorias', $dados);
            $this->session->set_flashdata('message', 'Categoria salva.');
            redirect('admin/financeiro/categorias');
        }
        $data['categorias'] = $this->db->order_by('tipo,nome')->get('fin_categorias')->result();
        $data['page_title'] = 'Categorias Financeiras';
        $data['body']       = 'financeiro/categorias';
        $this->load->view('template/main', $data);
    }

    // ── RELATÓRIOS ────────────────────────────────────────────
    public function relatorio($tipo = 'geral')
    {
        $data_ini = $this->input->get('data_ini') ?: date('Y-m-01');
        $data_fim = $this->input->get('data_fim') ?: date('Y-m-t');
        $conta_id = $this->input->get('conta_id');

        $data['lancamentos']     = $this->financeiro_model->get_lancamentos_relatorio($tipo, $data_ini, $data_fim, $conta_id);
        $data['totais']          = $this->financeiro_model->get_totais(['data_ini' => $data_ini, 'data_fim' => $data_fim, 'tipo' => in_array($tipo, ['receber','pagar']) ? $tipo : null, 'conta_id' => $conta_id]);
        $data['contas']          = $this->financeiro_model->get_contas();
        $data['contas_clientes'] = $this->clients_model->get_all_clients();
        $data['saldos']          = $this->financeiro_model->get_saldos_contas();
        $data['tipo']            = $tipo;
        $data['data_ini']        = $data_ini;
        $data['data_fim']        = $data_fim;
        $data['conta_id']        = $conta_id;
        $data['page_title']      = 'Relatório ' . ucfirst($tipo);
        $data['body']            = 'financeiro/relatorio';
        $this->load->view('template/main', $data);
    }

    // ── BPO ───────────────────────────────────────────────────
    public function bpo()
    {
        $filtros = [
            'client_id' => $this->input->get('client_id') ?: null,
            'status'    => $this->input->get('status') ?: null,
            'data_ini'  => $this->input->get('data_ini') ?: date('Y-m-d', strtotime('-180 days')),
            'data_fim'  => $this->input->get('data_fim') ?: date('Y-m-t'),
        ];
        $data['clientes']    = $this->clients_model->get_all_clients();
        $data['resumo_bpo']  = $this->financeiro_model->get_resumo_bpo($filtros);
        $data['lancamentos'] = $this->financeiro_model->get_lancamentos_bpo($filtros);
        $data['alertas']     = $this->financeiro_model->get_alertas_bpo();
        $data['page_title']  = 'BPO Financeiro';
        $data['body']        = 'financeiro/bpo';
        $this->load->view('template/main', $data);
    }

    public function bpo_cliente($client_id = 0)
    {
        if (!$client_id) redirect('admin/financeiro/bpo');
        $data['cliente']     = $this->clients_model->get_client($client_id);
        $data['lancamentos'] = $this->financeiro_model->get_lancamentos(['client_id' => $client_id]);
        $data['honorarios']  = $this->financeiro_model->get_honorarios_cliente($client_id);
        $data['page_title']  = 'BPO – Ficha do Cliente';
        $data['body']        = 'financeiro/bpo_cliente';
        $this->load->view('template/main', $data);
    }

    public function bpo_pdf($client_id = 0)
    {
        $data_ini  = $this->input->get('data_ini') ?: date('Y-m-01');
        $data_fim  = $this->input->get('data_fim') ?: date('Y-m-t');

        $filtros = [
            'client_id' => $client_id ?: ($this->input->get('client_id') ?: null),
            'data_ini'  => $data_ini,
            'data_fim'  => $data_fim,
            'status'    => $this->input->get('status') ?: null,
        ];

        // Lançamentos do período/cliente
        $lancamentos = $this->financeiro_model->get_lancamentos_bpo($filtros);

        // Totais
        $total_receber = 0;
        $total_pagar   = 0;
        foreach ($lancamentos as $l) {
            if ($l->tipo === 'receber') $total_receber += (float)$l->valor;
            else                        $total_pagar   += (float)$l->valor;
        }

        $data['lancamentos']  = $lancamentos;
        $data['totais']       = [
            'total_receber' => $total_receber,
            'total_pagar'   => $total_pagar,
        ];
        $data['saldo']        = $total_receber - $total_pagar;
        $data['cliente']      = $client_id ? $this->clients_model->get_client($client_id) : null;
        $data['setting']      = $this->setting_model->get_setting();
        $data['data_ini']     = $data_ini;
        $data['data_fim']     = $data_fim;

        // Gera PDF
        $this->load->helper('dompdf_helper');
        $html     = $this->load->view('financeiro/bpo_pdf', $data, true);
        $filename = $client_id
            ? 'BPO-' . preg_replace('/[^A-Za-z0-9]/', '-', $data['cliente']->name ?? 'cliente') . '-' . date('Ymd')
            : 'BPO-Geral-' . date('Ymd');

        pdf_create($html, $filename);
    }


    public function add_honorario()
    {
        if ($this->input->post('submitted')) {
            $valor = (float)str_replace(['.', ','], ['', '.'], $this->input->post('valor'));
            $dados = [
                'tipo'            => 'receber',
                'categoria'       => $this->input->post('categoria') ?: 'Honorários Advocatícios',
                'subcategoria'    => 'honorario',
                'descricao'       => $this->input->post('descricao'),
                'tax_id'          => $this->input->post('tax_id') ?: null,
                'tax_valor'       => (float)str_replace(',', '.', $this->input->post('tax_valor') ?: '0'),
                'fornecedor'      => $this->input->post('fornecedor'),
                'valor'           => $valor,
                'vencimento'      => $this->input->post('vencimento'),
                'competencia_mes' => $this->input->post('competencia_mes'),
                'client_id'       => $this->input->post('client_id') ?: null,
                'case_id'         => $this->input->post('case_id') ?: null,
                'responsavel_id'  => $this->input->post('responsavel_id') ?: null,
                'forma_pagamento' => $this->input->post('forma_pagamento'),
                'observacao'      => $this->input->post('observacao'),
                'status'          => 'pendente',
                'created_by'      => $this->session->userdata('id'),
                'created_at'      => date('Y-m-d H:i:s'),
            ];
            $this->financeiro_model->add_lancamento($dados);
            $this->session->set_flashdata('message', 'Honorário registrado.');
            redirect('admin/financeiro/bpo_cliente/' . $this->input->post('client_id'));
        }
        $data['clientes']   = $this->clients_model->get_all_clients();
        $data['advogados']  = $this->employees_model->get_all();
        $data['categorias'] = $this->financeiro_model->get_categorias('receber');
        $data['page_title'] = 'Registrar Honorário';
        $data['body']       = 'financeiro/add_honorario';
        $this->load->view('template/main', $data);
    }

    // ── RECIBO — CORREÇÃO itens 3, 7, 8, 9 ───────────────────
    // Rota: /admin/financeiro/recibo/{id}   → tela de visualização/impressão
    public function recibo($lancamento_id = 0)
    {
        if (!$lancamento_id) {
            $this->session->set_flashdata('error', 'Lançamento não encontrado.');
            redirect('admin/financeiro');
        }

        $lancamento = $this->financeiro_model->get_lancamento($lancamento_id);
        if (!$lancamento) {
            $this->session->set_flashdata('error', 'Lançamento não encontrado.');
            redirect('admin/financeiro');
        }

        // Busca cliente corretamente (objeto)
        $cliente = null;
        if (!empty($lancamento->client_id)) {
            $cliente = $this->db->where('id', $lancamento->client_id)->get('users')->row();
        }

        $setting = $this->setting_model->get_setting();
        // Pega template de recibo salvo ou usa padrão
        $template = $this->db->where('chave', 'recibo_template')->get('fin_config')->row();
        $texto_livre = $template ? $template->valor : 'O pagamento só terá validade mediante apresentação do comprovante de transferência.';

        $numero = 'REC-' . date('Y') . '-' . str_pad($lancamento_id, 5, '0', STR_PAD_LEFT);

        $data['lancamento']   = $lancamento;
        $data['cliente']      = $cliente;
        $data['setting']      = $setting;
        $data['numero']       = $numero;
        $data['texto_livre']  = $texto_livre;
        $data['valor_extenso'] = $this->_numero_por_extenso($lancamento->valor);
        $data['page_title']   = 'Recibo ' . $numero;
        $data['body']         = 'financeiro/recibo';
        $this->load->view('template/main', $data);
    }

    // Alias para compatibilidade com links antigos (gerar_recibo e imprimir_recibo)
    public function gerar_recibo($lancamento_id = 0)
    {
        $this->recibo($lancamento_id);
    }

    public function imprimir_recibo($lancamento_id = 0)
    {
        $this->recibo($lancamento_id);
    }

    // Salva o template editável do recibo (item 4)
    public function salvar_template_recibo()
    {
        $texto = $this->input->post('texto_livre');
        $existe = $this->db->where('chave', 'recibo_template')->count_all_results('fin_config');
        if ($existe) {
            $this->db->where('chave', 'recibo_template')->update('fin_config', ['valor' => $texto]);
        } else {
            $this->db->insert('fin_config', ['chave' => 'recibo_template', 'valor' => $texto]);
        }
        echo json_encode(['ok' => true]);
    }

    // PDF do recibo
    public function pdf_recibo($lancamento_id = 0)
    {
        if (!$lancamento_id) redirect('admin/financeiro');

        $lancamento = $this->financeiro_model->get_lancamento($lancamento_id);
        if (!$lancamento) redirect('admin/financeiro');

        $cliente = null;
        if (!empty($lancamento->client_id)) {
            $cliente = $this->db->where('id', $lancamento->client_id)->get('users')->row();
        }

        $template    = $this->db->where('chave', 'recibo_template')->get('fin_config')->row();
        $texto_livre = $template ? $template->valor : 'O pagamento só terá validade mediante apresentação do comprovante de transferência.';
        $numero      = 'REC-' . date('Y') . '-' . str_pad($lancamento_id, 5, '0', STR_PAD_LEFT);

        $data['lancamento']    = $lancamento;
        $data['cliente']       = $cliente;
        $data['setting']       = $this->setting_model->get_setting();
        $data['numero']        = $numero;
        $data['texto_livre']   = $texto_livre;
        $data['valor_extenso'] = $this->_numero_por_extenso($lancamento->valor);

        // Gera PDF usando dompdf
        $this->load->helper('dompdf_helper');
        $html = $this->load->view('financeiro/recibo_pdf', $data, true);
        pdf_create($html, 'Recibo-' . $numero);
    }

    // ── EXTRATO ───────────────────────────────────────────────
    public function extrato($conta_id = 0)
    {
        $data_ini = $this->input->get('data_ini') ?: date('Y-m-01');
        $data_fim = $this->input->get('data_fim') ?: date('Y-m-t');
        $data['lancamentos']     = $this->financeiro_model->get_extrato($conta_id, $data_ini, $data_fim);
        $data['conta']           = $this->db->where('id', $conta_id)->get('fin_contas')->row();
        $data['contas']          = $this->financeiro_model->get_contas();
        $data['contas_clientes'] = $this->clients_model->get_all_clients();
        $data['saldo']           = $this->financeiro_model->get_saldo_conta($conta_id, $data_ini, $data_fim);
        $data['data_ini']        = $data_ini;
        $data['data_fim']        = $data_fim;
        $data['page_title']      = 'Extrato - ' . ($data['conta']->nome ?? '');
        $data['body']            = 'financeiro/extrato';
        $this->load->view('template/main', $data);
    }

    // ── DEMAIS ────────────────────────────────────────────────
    public function recibos()
    {
        $data['recibos']    = $this->financeiro_model->get_recibos();
        $data['page_title'] = 'Recibos';
        $data['body']       = 'financeiro/recibos';
        $this->load->view('template/main', $data);
    }

    public function prolabore()
    {
        $data['lancamentos'] = $this->financeiro_model->get_prolabore();
        $data['advogados']   = $this->employees_model->get_all();
        $data['page_title']  = 'Pró-labore e Distribuição';
        $data['body']        = 'financeiro/prolabore';
        $this->load->view('template/main', $data);
    }

    public function comissoes()
    {
        $data['comissoes']  = $this->financeiro_model->get_comissoes();
        $data['page_title'] = 'Comissões';
        $data['body']       = 'financeiro/comissoes';
        $this->load->view('template/main', $data);
    }

    // ── HELPER EXTENSO ────────────────────────────────────────
    private function _numero_por_extenso($valor)
    {
        $valor = number_format(abs($valor), 2, '.', '');
        list($inteiro, $centavos) = explode('.', $valor);
        $inteiro   = (int)$inteiro;
        $centavos  = (int)$centavos;
        $un = ['','um','dois','três','quatro','cinco','seis','sete','oito','nove','dez','onze','doze','treze','quatorze','quinze','dezesseis','dezessete','dezoito','dezenove'];
        $dz = ['','','vinte','trinta','quarenta','cinquenta','sessenta','setenta','oitenta','noventa'];
        $ct = ['','cem','duzentos','trezentos','quatrocentos','quinhentos','seiscentos','setecentos','oitocentos','novecentos'];
        $fn = function($n) use ($un, $dz, $ct, &$fn) {
            $p = [];
            if ($n >= 100) { $h = (int)($n / 100); $p[] = ($n % 100 === 0) ? $ct[$h] : str_replace('cem','cento',$ct[$h]); $n %= 100; }
            if ($n >= 20)  { $p[] = $dz[(int)($n / 10)]; $n %= 10; }
            if ($n > 0)    { $p[] = $un[$n]; }
            return implode(' e ', array_filter($p));
        };
        $txt = '';
        if ($inteiro >= 1000) {
            $mil = (int)($inteiro / 1000);
            $txt = ($mil === 1 ? 'mil' : $fn($mil) . ' mil');
            if ($inteiro % 1000 > 0) $txt .= ' e ' . $fn($inteiro % 1000);
        } else {
            $txt = $fn($inteiro);
        }
        $txt .= $inteiro === 1 ? ' real' : ' reais';
        if ($centavos > 0) $txt .= ' e ' . $fn($centavos) . ' centavo' . ($centavos > 1 ? 's' : '');
        return ucfirst($txt);
    }
}
