<?php

include_once 'pagina.php';

class Relatorio extends Pagina {
    public $tiposPermitidos;
    public $nomeArquivo;
    public $imprimeCabecalho;
    public $imprimeRodape;
    public $numeroPaginaRodape;
    public $dataHoraRodape;
    public $exibirLinkVoltar;

    public function __construct() {
        $this->tiposPermitidos = array('html', 'pdf', 'xls');
        $this->nomeArquivo = 'relatorio' . uniqid();
        $this->imprimeCabecalho = true;
        $this->imprimeRodape = ($_REQUEST['tipo'] == 'doc')? false : true;
        $this->numeroPaginaRodape = ($_REQUEST['tipo'] == 'doc')? false : true;
        $this->dataHoraRodape = ($_REQUEST['tipo'] == 'doc')? false : true;
        $this->exibirLinkVoltar = true;
        
        parent::__construct();
        if(empty($_REQUEST[executarAcao]) AND empty($_REQUEST[acao])) $this->includehead = "<style>body{max-width: 95%;}</style>";
    }

    public function corpo() {
        if($this->exibirLinkVoltar) echo "<div><a href='../administrativo/home.php' class='voltar'>Voltar para a tela inicial</a></div><br/>";
        
        echo "<form action='' method='POST' onsubmit=\"return validaFormulario();\">";
        
        $this->filtro();
        $this->formatos();

        echo "</form>";

        //Se o tipo de saída é html, imprime o filtro e os formatos normalmente,
        //mais o resultado
        if($_REQUEST['tipo'] == 'html') {
            $this->conteudo();
        }
    }

    public function montar() {
        //Se não é um a página de arquivo, exibe a página como especificada em body(),
        //com o filtro e os botões
        if(empty($_REQUEST['tipo']) OR $_REQUEST['tipo'] == 'html') {
            parent::montar();
        }
        else {
            ob_start();
            $this->conteudo();
            $conteudoCapturado = ob_get_clean();

            switch ($_REQUEST['tipo']) {

                //Se o tipo de saída é html, imprime o filtro e os formatos normalmente,
                //mais o resultado
                case 'html':
                    parent::montar();

                    break;

                case 'pdf':
                    $this->montarPDF($conteudoCapturado);

                    break;

                case 'xls':
                    $this->montarXLS($conteudoCapturado);

                    break;

                case 'doc':
                    $this->montarDOC($conteudoCapturado);

                    break;

                default:
                    
                    break;
            }
        }
    }
    
    /**
     * Formulário com os campos que gerarão a saída
     * do relatório
     */
    public function filtro() {
        //implementado pela classe filha
    }

    /**
     * Conteúdo da saída do relatório, baseado nos dados
     * que vêem do filtro
     */
    public function conteudo() {
        //implementado pela classe filha
    }
    

    public function formatos() {
        $tiposPermitidos = $this->tiposPermitidos;

        //Exibe os formatos de saida
        echo "<br/><div align='center'>";

        if(empty($tiposPermitidos) || in_array('html', $tiposPermitidos)) {
            echo "<button type='submit' value='html' name='tipo' class='pesquisar'>Visualizar</button>&nbsp;&nbsp;";
        }
        if(empty($tiposPermitidos) || in_array('pdf', $tiposPermitidos)) {
            echo "<button type='submit' value='pdf' name='tipo' class='pdf'>PDF</button>&nbsp;&nbsp;";
        }
        if(isset($tiposPermitidos) && in_array('doc', $tiposPermitidos)) {
            echo "<button type='submit' value='doc' name='tipo' class='doc'>DOC</button>&nbsp;&nbsp;";
        }
        if(isset($tiposPermitidos) && in_array('xls', $tiposPermitidos)) {
            echo "<button type='submit' value='xls' name='tipo' class='xls'>XLS</button>&nbsp;&nbsp;";
        }

        echo "</div>";
    }

    /**
     * Cabeçalho da página
     * @return String HTML do cabeçalho da página
     */
    public function cabecalhoPagina() {
        if($this->imprimeCabecalho){
            
        }
    }

    /**
     * Informação extra a ser adicionado no final
     * do cabeçalho da página
     * @return String HTML do conteúdo extra
     */
    public function informacaoCabecalho() {
        return '';
    }

    /**
     * Rodapé da página que será usada em documentos DOC e PDF
     * @return String                HTML do rodapé
     */
    public function rodapePagina() {
        if($this->imprimeRodape){
            $rodape = '<hr/><div align="right">';
            
            date_default_timezone_set("America/Sao_Paulo"); 
            
            if($this->dataHoraRodape) $rodape .= date('d/m/Y - H:i', time());
            if($this->numeroPaginaRodape) $rodape .= ' - Pág. {PAGENO}/{nbpg}';
            $rodape .= '</div>';

            return $rodape;
        }
    }

    /**
     * CSS extra para personalizar a saída para arquivos PDF
     * @return String Regras CSS (sem a tag) extras
     */
    public function cssPersonalizado() {
        return '';
    }

    public function montarPDF($conteudo) {
        include_once '../lib/mpdf/mpdf.php';
        $estilizacaoTabela = "<style type='text/css'>
                                body { font-family: arial }
                                a { text-decoration: none; color: black; }
                                table { border-spacing: 0px; padding: 1px; border-collapse: collapse; }
                                th { background-color: white; font-size: 12px; border: 1px solid #000000; }
                                td { font-size: 11px; text-align: left; border: 1px solid #000000;}
                                {$this->cssPersonalizado()}
                            </style>";

        $mpdf = new mPDF('','A4', '', '', 10, 10, 40, 15, 5, 5, 'P');
        $mpdf->SetHTMLHeader($this->cabecalhoPagina());
        $mpdf->SetHTMLFooter($this->rodapePagina());
        $mpdf->WriteHTML($estilizacaoTabela . $conteudo);
        $mpdf->Output($this->nomeArquivo . '.pdf', 'I');
    }

    public function montarXLS($conteudo) {
        header('Content-type: application/msexcel; charset=utf-8');
        header('Content-Disposition: attachment; filename=' . $this->nomeArquivo . '.xls');
        header("Pragma: no-cache");
        
        echo utf8_decode($conteudo);
    }

    public function montarDOC($conteudo) {
        header('Content-type: application/vnd.ms-word; charset=utf-8');
        header('Content-Disposition: attachment; filename=' . $this->nomeArquivo . '.doc');
        header("Pragma: no-cache");
        echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">";

        echo $this->cabecalhoPagina();
        echo $conteudo;
        echo $this->rodapePagina();
    }
    
}
