<?php
declare(strict_types=1);


namespace App\Services;


use App\DAO\DAOResponse\DAOResponseInterface;
use App\DAO\RelatorioDAO;
use App\Services\ServiceResponse\ServiceResponse;
use App\Services\ServiceResponse\ServiceResponseInterface;
use App\Terms\AutorizacaoEutanaziaTerm;
use App\Terms\ProcedimentosConsultaTerm;
use App\Terms\RelatorioEstatisticoCadastroTutor;
use App\Terms\RelatorioEstatisticoConsulta;
use App\Terms\RelatorioEstatisticoFaturamento;
use App\Terms\RelatorioEstatisticoPrimeiraConsulta;
use App\Terms\RelatorioEstatisticoProcedimentoExecutado;
use App\Terms\RelatorioPetUnidade;
use App\Terms\RelatorioProcedimentoValor;
use App\Utils\Collections\GeneralCollection;
use Dompdf\Dompdf;
use Dompdf\Options;
use App\Terms\AtestadoObitoTerm;
use App\Terms\AutorizacaoGeralTerm;
use App\Terms\DoacaoInsumosProdutosTerm;
use App\Terms\GravarAudioImagemVideoTerm;
use App\Terms\RecusaGeralTerm;
use App\Terms\RemocaoEmObitoTerm;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

class RelatorioService extends Service
{
    public function getTermoProcedimentosConsulta (int $id_consulta) {
        $relatorio_dao = new RelatorioDAO();
        $relatorio_html = new ProcedimentosConsultaTerm();
        $dao_response = $relatorio_dao->getProcedimentosConsulta($id_consulta);
        $page = $relatorio_html->getProcedimentosConsulta($dao_response);

        $options = new Options();
        $options->setChroot(__DIR__);
        $options->setIsRemoteEnabled(true);
        $dompdf = new Dompdf($options);
        $dompdf->loadHtml($page);
        $dompdf->render();

        return $dompdf;
    }

    public function getTermoAutorizacaoEutanazia (int $id_pet) {
        $relatorio_dao = new RelatorioDAO();
        $relatorio_html = new AutorizacaoEutanaziaTerm();
        $dao_response = $relatorio_dao->getPet($id_pet);
        $page = $relatorio_html->getTermoAutorizacaoEutanazia($dao_response);

        $options = new Options();
        $options->setChroot(__DIR__);
        $options->setIsRemoteEnabled(true);
        $dompdf = new Dompdf($options);
        $dompdf->loadHtml($page);
        $dompdf->render();

        // REGISTRANDO O ARQUIVO NA PASTA DO CLIENTE -> PET
        $output = $dompdf->output();
        $url = $this->move_arquivo($output, $id_pet, $dao_response['id_cliente']);
        $relatorio_dao->persistDocumentoGerado($url, $id_pet, $dao_response['id_cliente'], 'Termo de Autorização para Eutanázia.');

        return $dompdf;
    }

    public function getTermoAtestadoObito (int $id_pet) {
        $relatorio_dao = new RelatorioDAO();
        $relatorio_html = new AtestadoObitoTerm();
        $dao_response = $relatorio_dao->getPet($id_pet);
        $page = $relatorio_html->getTermoAtestadoObito($dao_response);
        
        $options = new Options();
        $options->setChroot(__DIR__);
        $options->setIsRemoteEnabled(true);
        $dompdf = new Dompdf($options);
        $dompdf->loadHtml($page);
        $dompdf->render();


        // REGISTRANDO O ARQUIVO NA PASTA DO CLIENTE -> PET
        $output = $dompdf->output();
        $url = $this->move_arquivo($output, $id_pet, $dao_response['id_cliente']);
        $relatorio_dao->persistDocumentoGerado($url, $id_pet, $dao_response['id_cliente'], 'Termo de Atestado de Óbito.');
        
        return $dompdf;
    }
    
    
    public function getTermoAutorizacaoGeral(int $id_pet) {
        $relatorio_dao = new RelatorioDAO();
        $relatorio_html = new AutorizacaoGeralTerm();
        $dao_response = $relatorio_dao->getPet($id_pet);
        $page = $relatorio_html->getTermoAutorizacaoGeral($dao_response);
        
        $options = new Options();
        $options->setChroot(__DIR__);
        $options->setIsRemoteEnabled(true);
        $dompdf = new Dompdf($options);
        $dompdf->loadHtml($page);
        $dompdf->render();

        // REGISTRANDO O ARQUIVO NA PASTA DO CLIENTE -> PET
        $output = $dompdf->output();
        $url = $this->move_arquivo($output, $id_pet, $dao_response['id_cliente']);
        $relatorio_dao->persistDocumentoGerado($url, $id_pet, $dao_response['id_cliente'], 'Termo de Autorização Geral.');
        
        return $dompdf;
    }
    
    public function getTermoDoacaoInsumosProdutos(int $id_pet) {
        $relatorio_dao = new RelatorioDAO();
        $relatorio_html = new DoacaoInsumosProdutosTerm();
        $dao_response = $relatorio_dao->getPet($id_pet);
        $page = $relatorio_html->getTermoDoacaoInsumosProdutos($dao_response);
        
        $options = new Options();
        $options->setChroot(__DIR__);
        $options->setIsRemoteEnabled(true);
        $dompdf = new Dompdf($options);
        $dompdf->loadHtml($page);
        $dompdf->render();

        // REGISTRANDO O ARQUIVO NA PASTA DO CLIENTE -> PET
        $output = $dompdf->output();
        $url = $this->move_arquivo($output, $id_pet, $dao_response['id_cliente']);
        $relatorio_dao->persistDocumentoGerado($url, $id_pet, $dao_response['id_cliente'], 'Termo de Doação de Insumos e Produtos.');
        
        return $dompdf;
    }
    
    public function getTermoGravarAudioImagemVideo(int $id_pet) {
        $relatorio_dao = new RelatorioDAO();
        $relatorio_html = new GravarAudioImagemVideoTerm();
        $dao_response = $relatorio_dao->getPet($id_pet);
        $page = $relatorio_html->getTermoGravarAudioImagemVideo($dao_response);
        
        $options = new Options();
        $options->setChroot(__DIR__);
        $options->setIsRemoteEnabled(true);
        $dompdf = new Dompdf($options);
        $dompdf->loadHtml($page);
        $dompdf->render();

        // REGISTRANDO O ARQUIVO NA PASTA DO CLIENTE -> PET
        $output = $dompdf->output();
        $url = $this->move_arquivo($output, $id_pet, $dao_response['id_cliente']);
        $relatorio_dao->persistDocumentoGerado($url, $id_pet, $dao_response['id_cliente'], 'Termo de Gravação de Imagem.');


        return $dompdf;
    }
    
    public function getTermoRecusaGeral(int $id_pet) {
        $relatorio_dao = new RelatorioDAO();
        $relatorio_html = new RecusaGeralTerm();
        $dao_response = $relatorio_dao->getPet($id_pet);
        $page = $relatorio_html->getTermoRecusaGeral($dao_response);
        
        $options = new Options();
        $options->setChroot(__DIR__);
        $options->setIsRemoteEnabled(true);
        $dompdf = new Dompdf($options);
        $dompdf->loadHtml($page);
        $dompdf->render();

        // REGISTRANDO O ARQUIVO NA PASTA DO CLIENTE -> PET
        $output = $dompdf->output();
        $url = $this->move_arquivo($output, $id_pet, $dao_response['id_cliente']);
        $relatorio_dao->persistDocumentoGerado($url, $id_pet, $dao_response['id_cliente'], 'Termo de Recusa Geral.');
        
        return $dompdf;
    }
    
    
    public function getTermoRemocaoEmObito(int $id_pet) {
        $relatorio_dao = new RelatorioDAO();
        $relatorio_html = new RemocaoEmObitoTerm();
        $dao_response = $relatorio_dao->getPet($id_pet);
        $page = $relatorio_html->getTermoRemocaoEmObito($dao_response);
        
        $options = new Options();
        $options->setChroot(__DIR__);
        $options->setIsRemoteEnabled(true);
        $dompdf = new Dompdf($options);
        $dompdf->loadHtml($page);
        $dompdf->render();

        // REGISTRANDO O ARQUIVO NA PASTA DO CLIENTE -> PET
        $output = $dompdf->output();
        $url = $this->move_arquivo($output, $id_pet, $dao_response['id_cliente']);
        $relatorio_dao->persistDocumentoGerado($url, $id_pet, $dao_response['id_cliente'], 'Termo de Remoção em Óbito.');
        
        return $dompdf;
    }

    public function getRelatorioPetUnidadePdf(int $id_unidade) {
        $relatorio_dao = new RelatorioDAO();
        $relatorio_html = new RelatorioPetUnidade();
        $dao_response = $relatorio_dao->getPetUnidade($id_unidade);
        $page = $relatorio_html->getRelatorioPetUnidade($dao_response);

        $options = new Options();
        $options->setChroot(__DIR__);
        $options->setIsRemoteEnabled(true);
        $dompdf = new Dompdf($options);
        $dompdf->loadHtml($page);
        $dompdf->render();

        // REGISTRANDO O ARQUIVO NA PASTA DO CLIENTE -> PET
        $output = $dompdf->output();
        //$url = $this->move_arquivo($output, $id_unidade, $dao_response['id_cliente']);
        //$relatorio_dao->persistDocumentoGerado($url, $id_unidade, $dao_response['id_cliente'], 'Relatório Pets por Unidade.');

        return $dompdf;
    }

    public function getRelatorioPetUnidadeExcel(int $id_unidade) {
        header( 'Content-Type: application/vnd.ms-excel' );
        header( 'Content-Disposition: attachment;filename="testeabc.xlsx"' );
        $spreadsheet = new Spreadsheet();
        $relatorio_dao = new RelatorioDAO();
        $dao_response = $relatorio_dao->getPetUnidade($id_unidade);

        $sheet = $spreadsheet->getActiveSheet();
        $cols = [
            "ID PET",
            "PET",
            "ID TUTOR",
            "TUTOR",
            "DATA CADASTRO",
            "RAÇA"
        ];

        $sheet->fromArray( $cols, null, 'A1' );
        $row_start = 2;

        foreach ( $dao_response as $value ) {
            $array_row [] = $value["id_pet"];
            $array_row [] = $value["nome_pet"];
            $array_row [] = $value["id_paciente"];
            $array_row [] = $value["nome"];
            $array_row [] = $value ["criado_em"];
            $array_row [] = $value ["nome_raca"];

            $sheet->fromArray( $array_row, null, 'A' . $row_start );
            unset( $array_row );
            $row_start++;
        }

        $writer = new Xlsx( $spreadsheet );
        return $writer;
    }


    public function getRelatorioProcedimentoValorPdf($response) {
        $relatorio_html = new RelatorioProcedimentoValor();
        $page = $relatorio_html->getRelatorioProcedimentoValor($response);

        $options = new Options();
        $options->setChroot(__DIR__);
        $options->setIsRemoteEnabled(true);
        $dompdf = new Dompdf($options);
        $dompdf->loadHtml($page);
        $dompdf->render();

        $output = $dompdf->output();

        return $dompdf;
    }

    public function getRelatorioProcedimentoValorExcel($dados) {
        header( 'Content-Type: application/vnd.ms-excel' );
        header( 'Content-Disposition: attachment;filename="procedimentovalor.xlsx"' );
        $spreadsheet = new Spreadsheet();
        $relatorio_dao = new RelatorioDAO();
       //dao_response = $relatorio_dao->getPetUnidade($id_unidade);

        $sheet = $spreadsheet->getActiveSheet();
        $cols = [
            "Procedimento",
            "Tipo Procedimento",
            "Convenio",
            "Unidade",
            "Status",
            "Data de inicio",
            "Valor Cliente",
            "Valor interno",
            "Valor de Repasse Médico",
        ];

        $sheet->fromArray( $cols, null, 'A1' );
        $row_start = 2;

        foreach ( $dados as $value ) {
            $array_row [] = $value["descricao_procedimento"];
            $array_row [] = $value["descricao_tipo_procedimento"];
            $array_row [] = $value["descricao_convenio"];
            $array_row [] = $value["descricao_unidade"];
            $array_row [] = ($value["status"] ? 'ATIVO' : 'INATIVO'  );
            $array_row [] = date( "d/m/Y", strtotime( $value["data_inicio"] ) );
            $array_row [] = $value ["valor"];
            $array_row [] = $value ["valor_interno"];
            $array_row [] = $value ["valor_repasse_medico"];

            $sheet->fromArray( $array_row, null, 'A' . $row_start );
            unset( $array_row );
            $row_start++;
        }

        $writer = new Xlsx( $spreadsheet );
        return $writer;
    }


    # ------------------------------------------------------------------------------------------------------------------------------- #
    # ------------------------------------------------- RELATORIO ESTATÍSTICO ------------------------------------------------------- #
    # ------------------------------------------------------------------------------------------------------------------------------- #
    public function getRelatorioEstatisticoProcedimentoExecutadoPdf(int $dtini, int $dtfim, int $idunidade) {

        $procedimento_dao = new RelatorioDAO();
        $relatorio = new RelatorioEstatisticoProcedimentoExecutado();
        $response = $procedimento_dao->getRelatorioEstatisticoProcedimentoExecutadoList($dtini, $dtfim, $idunidade);
        $page = $relatorio->getRelatorioEstatisticoProcedimentoExecutadoPdf($response);
        $options = new Options();
        $options->setChroot(__DIR__);
        $options->setIsRemoteEnabled(true);
        $dompdf = new Dompdf($options);
        $dompdf->loadHtml($page);
        $dompdf->render();
        $dompdf->output();

        return $dompdf;
    }

    public function getRelatorioEstatisticoProcedimentoExecutadoExcel(int $dtini, int $dtfim, int $idunidade) {

        $procedimento_dao = new RelatorioDAO();
        $relatorio = new RelatorioEstatisticoProcedimentoExecutado();
        $response = $procedimento_dao->getRelatorioEstatisticoProcedimentoExecutadoList($dtini, $dtfim, $idunidade);
        return $relatorio->getRelatorioEstatisticoProcedimentoExecutadoExcel($response);
    }

    public function getRelatorioEstatisticoConsultaPdf(int $dtini, int $dtfim, int $idunidade, int $tipoprocedimento) {

        $procedimento_dao = new RelatorioDAO();
        $relatorio = new RelatorioEstatisticoConsulta();
        $response = $procedimento_dao->getRelatorioEstatisticoConsultaList($dtini, $dtfim, $idunidade, $tipoprocedimento);
        $page = $relatorio->getRelatorioEstatisticoConsultaPdf($response);
        $options = new Options();
        $options->setChroot(__DIR__);
        $options->setIsRemoteEnabled(true);
        $dompdf = new Dompdf($options);
        $dompdf->loadHtml($page);
        $dompdf->render();
        $dompdf->output();

        return $dompdf;
    }

    public function getRelatorioEstatisticoConsultaExcel(int $dtini, int $dtfim, int $idunidade, int $tipoprocedimento) {

        $procedimento_dao = new RelatorioDAO();
        $relatorio = new RelatorioEstatisticoConsulta();
        $response = $procedimento_dao->getRelatorioEstatisticoConsultaList($dtini, $dtfim, $idunidade, $tipoprocedimento);
        return $relatorio->getRelatorioEstatisticoConsultaExcel($response);
    }

    public function getRelatorioEstatisticoPrimeiraConsultaPdf(int $dtini, int $dtfim, int $idunidade) {

        $procedimento_dao = new RelatorioDAO();
        $relatorio = new RelatorioEstatisticoPrimeiraConsulta();
        $response = $procedimento_dao->getRelatorioEstatisticoPrimeiraConsultaList($dtini, $dtfim, $idunidade);
        $page = $relatorio->getRelatorioEstatisticoPrimeiraConsultaPdf($response);
        $options = new Options();
        $options->setChroot(__DIR__);
        $options->setIsRemoteEnabled(true);
        $dompdf = new Dompdf($options);
        $dompdf->loadHtml($page);
        $dompdf->render();
        $dompdf->output();

        return $dompdf;
    }

    public function getRelatorioEstatisticoPrimeiraConsultaExcel(int $dtini, int $dtfim, int $idunidade) {

        $procedimento_dao = new RelatorioDAO();
        $relatorio = new RelatorioEstatisticoPrimeiraConsulta();
        $response = $procedimento_dao->getRelatorioEstatisticoPrimeiraConsultaList($dtini, $dtfim, $idunidade);
        return $relatorio->getRelatorioEstatisticoPrimeiraConsultaExcel($response);
    }


    public function getRelatorioEstatisticoCadastroTutorPdf(int $dtini, int $dtfim, int $idunidade) {

        $procedimento_dao = new RelatorioDAO();
        $relatorio = new RelatorioEstatisticoCadastroTutor();
        $response = $procedimento_dao->getRelatorioEstatisticoCadastroTutorList($dtini, $dtfim, $idunidade);
        $page = $relatorio->getRelatorioEstatisticoCadastroTutorPdf($response);
        $options = new Options();
        $options->setChroot(__DIR__);
        $options->setIsRemoteEnabled(true);
        $dompdf = new Dompdf($options);
        $dompdf->loadHtml($page);
        $dompdf->render();
        $dompdf->output();

        return $dompdf;
    }

    public function getRelatorioEstatisticoCadastroTutorExcel(int $dtini, int $dtfim, int $idunidade) {

        $procedimento_dao = new RelatorioDAO();
        $relatorio = new RelatorioEstatisticoCadastroTutor();
        $response = $procedimento_dao->getRelatorioEstatisticoCadastroTutorList($dtini, $dtfim, $idunidade);
        return $relatorio->getRelatorioEstatisticoCadastroTutorExcel($response);
    }




    public function getRelatorioEstatisticoFaturamentoPdf(int $dtini, int $dtfim, int $idunidade) {

        $procedimento_dao = new RelatorioDAO();
        $relatorio = new RelatorioEstatisticoFaturamento();
        $response = $procedimento_dao->getRelatorioEstatisticoFaturamentoList($dtini, $dtfim, $idunidade);
        $page = $relatorio->getRelatorioEstatisticoConsultaPdf($response);
        $options = new Options();
        $options->setChroot(__DIR__);
        $options->setIsRemoteEnabled(true);
        $dompdf = new Dompdf($options);
        $dompdf->loadHtml($page);
        $dompdf->render();
        $dompdf->output();

        return $dompdf;
    }

    public function getRelatorioEstatisticoFaturamentoExcel(int $dtini, int $dtfim, int $idunidade) {

        $procedimento_dao = new RelatorioDAO();
        $relatorio = new RelatorioEstatisticoFaturamento();
        $response = $procedimento_dao->getRelatorioEstatisticoFaturamentoList($dtini, $dtfim, $idunidade);
        return $relatorio->getRelatorioEstatisticoConsultaExcel($response);
    }






    public function move_arquivo($output, $id_pet, $id_cliente) {
        $data_upload = date("Y.m.d-H.i.s");
        $new_name = $data_upload . ".txt"; //Definindo um novo nome para o arquivo

        $dir = '../writable/uploads/'. $id_cliente . '/';
        if(!is_dir($dir)) {mkdir($dir);}
        $dir = $dir.$id_pet.'/';
        if(!is_dir($dir)) {mkdir($dir);}

        file_put_contents($dir.$new_name, $output);//Fazer upload do arquivo

        $key = "HLuM5EYw5cd0vdJR9yLlM6wt2vte5iniQBqE70nZuhK=";
        $msg = file_get_contents($dir.$new_name);
        $encrypt = new EncryptService();
        $msg_encrypted = $encrypt->my_encrypt($msg, $key);
        $file = fopen($dir.$new_name, "wb");
        fwrite($file, $msg_encrypted);
        fclose($file);

        return $dir.$new_name;
    }



    
    
    
}
