<?php

namespace App\DAO;

use App\DAO\DAOResponse\DAOResponse;
use App\DAO\DAOResponse\DAOResponseInterface;
use App\Mappers\PetMapper;
use App\Models\DocumentoGeradoModel;
use App\Utils\Collections\QueryFilterCollection;

class RelatorioDAO extends DAO
{

    public function getProcedimentosConsulta(int $id_consulta) {

        $sql = '
            select
                p.id as procedimento_id
                ,p.descricao as procedimento_descricao
                ,tp.descricao as tipo_procedimento
                ,c.codigo as convenio_codigo
                ,c.descricao as convenio_descricao
                ,tc.descricao as tipo_convenio_descricao
                ,rp.data_requisicao as data_requisicao 
                ,rp.hora_requisicao as hora_requisicao 
                ,a2.id_medico as id_medico 
                ,m.assinatura as assinatura
            from requisicao_procedimento rp
            inner join convenio_procedimento cp on cp.id = rp.id_convenio_procedimento 
            inner join convenio c on c.id = cp.id_convenio 
            inner join tipo_convenio tc on tc.id = c.id_tipo_convenio 
            inner join procedimento p on p.id = cp.id_procedimento 
            inner join tipo_procedimento tp on tp.id = p.id_tipo_procedimento 
            inner join consulta c2 on rp.id_consulta = c2.id 
            inner join agendamento a ON a.id = c2.id_agendamento 
            inner join agenda a2 on a.id_agenda = a2.id 
            inner join medico m on m.id = a2.id_medico
            WHERE
                rp.id_consulta =  :id_consulta:
        ';
        $binds = [ 'id_consulta' => $id_consulta ];
        $query = $this->db->query( $sql, $binds );
        $result_array = $query->getResultArray();
        return $result_array;

    }

    public function getPet(int $id_pet) {

        $sql = '
            SELECT 
            pet.id as id_pet,
            pet.nome as nome_pet,
            pet.data_nascimento as data_nascimento,
            pet.cor as cor,
            pet.sexo as sexo,
            pet.castrado as castrado,
            pet.numero_chip as numero_chip,
            pet.rga_pedigree as rga_pedigree,
            pet.doado as doado,
            pet.nome as nome_pet,
            pet.porte as porte,
            pet.observacoes as observacoes,
            raca.id as id_raca,
            raca.nome as nome_raca,
            especie.id as id_especie,
            especie.nome as nome_especie,
            pet_cliente.id_cliente  as id_cliente,
            pessoa_fisica.nome,
            pessoa_fisica.cpf,
            paciente.id as id_paciente
            FROM pet
            INNER JOIN pet_status on pet_status.id = pet.id_pet_status
            LEFT JOIN pet_foto on pet_foto.id_pet = pet.id 
            INNER JOIN raca on raca.id  = pet.id_raca 
            INNER JOIN especie on especie.id = raca.id_especie 
            INNER JOIN pet_cliente on pet_cliente.id_pet = pet.id
            INNER JOIN cliente on pet_cliente.id_cliente = cliente.id 
            INNER JOIN pessoa_fisica on cliente.id_pessoa = pessoa_fisica.id_pessoa 
            INNER JOIN paciente on paciente.id_pessoa = pessoa_fisica.id_pessoa
            WHERE pet.id = :id_pet:
        ';
        $binds = [ 'id_pet' => $id_pet ];
        $query = $this->db->query( $sql, $binds );
        $result_array = $query->getResultArray();
        return $result_array[0];
    }

    public function getPetUnidade(int $id_unidade) {
        $sql = '
            SELECT 
            pet.id as id_pet,
            pet.nome as nome_pet,
            pet.data_nascimento as data_nascimento,
            pet.cor as cor,
            pet.sexo as sexo,
            pet.castrado as castrado,
            pet.numero_chip as numero_chip,
            pet.rga_pedigree as rga_pedigree,
            pet.doado as doado,
            pet.nome as nome_pet,
            pet.porte as porte,
            pet.observacoes as observacoes,
            raca.id as id_raca,
            raca.nome as nome_raca,
            especie.id as id_especie,
            especie.nome as nome_especie,
            pet_cliente.id_cliente  as id_cliente,
            pessoa_fisica.nome,
            pessoa_fisica.cpf,
            paciente.id as id_paciente,
            paciente.criado_em as criado_em
            FROM pet
            INNER JOIN pet_status on pet_status.id = pet.id_pet_status
            LEFT JOIN pet_foto on pet_foto.id_pet = pet.id 
            INNER JOIN raca on raca.id  = pet.id_raca 
            INNER JOIN especie on especie.id = raca.id_especie 
            INNER JOIN pet_cliente on pet_cliente.id_pet = pet.id
            INNER JOIN cliente on pet_cliente.id_cliente = cliente.id 
            INNER JOIN pessoa_fisica on cliente.id_pessoa = pessoa_fisica.id_pessoa 
            INNER JOIN paciente on paciente.id_pessoa = pessoa_fisica.id_pessoa
            INNER JOIN comanda c on c.id_pet = pet.id
            WHERE c.id_unidade = :id_unidade: group by pet.id, paciente.id
        ';
        $binds = [ 'id_unidade' => $id_unidade ];
        $query = $this->db->query( $sql, $binds );
        $result_array = $query->getResultArray();
        return $result_array;
    }

    # ------------------------------------------------------------------------------------------------------------------------------- #
    # ------------------------------------------------- RELATORIO ESTATÍSTICO ------------------------------------------------------- #
    # ------------------------------------------------------------------------------------------------------------------------------- #
    public function getRelatorioEstatisticoProcedimentoExecutadoList(int $dtini, int $dtfim, int $idunidade) {
        $sql = '
            SELECT 
                procedimento.descricao as procedimento_descricao,
                requisicao_procedimento.data_execucao,
                convenio.descricao as convenio_descricao,
                unidade.descricao as unidade_descricao
            FROM requisicao_procedimento 
                INNER JOIN convenio_procedimento on requisicao_procedimento.id_convenio_procedimento = convenio_procedimento.id 
                INNER JOIN convenio on convenio_procedimento.id_convenio = convenio.id  
                INNER JOIN procedimento on convenio_procedimento.id_procedimento = procedimento.id 
                INNER JOIN unidade on convenio_procedimento.id_unidade = unidade.id  
            WHERE 
                requisicao_procedimento.status_id = 2 AND 
                requisicao_procedimento.data_requisicao >= :dtini: AND 
                requisicao_procedimento.data_requisicao <= :dtfim: AND 
                convenio_procedimento.id_unidade = :id_unidade:
        ';
        $binds = [ 'id_unidade' => $idunidade, 'dtini' => $dtini, 'dtfim' => $dtfim ];
        $query = $this->db->query( $sql, $binds );
        $result_array = $query->getResultArray();
        return $result_array;
    }

    public function getRelatorioEstatisticoConsultaList(int $dtini, int $dtfim, int $idunidade, int $tipoprocedimento) {
        $sql = '
            SELECT 
                procedimento.descricao as procedimento_descricao,
                requisicao_procedimento.data_execucao,
                convenio.descricao as convenio_descricao,
                unidade.descricao as unidade_descricao
            FROM requisicao_procedimento 
                INNER JOIN convenio_procedimento on requisicao_procedimento.id_convenio_procedimento = convenio_procedimento.id 
                INNER JOIN convenio on convenio_procedimento.id_convenio = convenio.id  
                INNER JOIN procedimento on convenio_procedimento.id_procedimento = procedimento.id 
                INNER JOIN unidade on convenio_procedimento.id_unidade = unidade.id  
                INNER JOIN tipo_procedimento on tipo_procedimento.id = procedimento.id_tipo_procedimento
            WHERE 
                requisicao_procedimento.status_id = 2 AND 
                requisicao_procedimento.data_requisicao >= :dtini: AND 
                requisicao_procedimento.data_requisicao <= :dtfim: AND 
                convenio_procedimento.id_unidade = :id_unidade: AND
                tipo_procedimento.id = :tipo_procedimento:
        ';
        $binds = [ 'id_unidade' => $idunidade, 'dtini' => $dtini, 'dtfim' => $dtfim, 'tipo_procedimento' => $tipoprocedimento ];
        $query = $this->db->query( $sql, $binds );
        $result_array = $query->getResultArray();
        return $result_array;
    }

    public function getRelatorioEstatisticoPrimeiraConsultaList(int $dtini, int $dtfim, int $idunidade) {
        $sql = '
            SELECT 
                rp.id,
                rp.id_pet,
                p2.nome,
                rp.id_convenio_procedimento,
                rp.id_consulta,
                p.descricao as descricao_procedimento,
                rp.data_execucao,
                rp.hora_execucao,
                cp.id_unidade,
                u.descricao as descricao_unidade
            FROM 
                requisicao_procedimento rp 
                inner join consulta c on rp.id_consulta = c.id
                inner join convenio_procedimento cp on cp.id = rp.id_convenio_procedimento 
                inner join procedimento p on cp.id_procedimento = p.id 
                inner join tipo_procedimento tp on tp.id = p.id_tipo_procedimento 
                inner join pet p2 on rp.id_pet = p2.id 
                inner join unidade u on cp.id_unidade = u.id 
            WHERE 
                tp.id = 2 and
                data_execucao >= :dtini: and 
                data_execucao <= :dtfim: and
                data_execucao = (select min(data_execucao) 
                                from requisicao_procedimento rp2 
                                inner join convenio_procedimento cp2 on rp2.id_convenio_procedimento = cp2.id  
                                where 
                                rp.id_pet = rp2.id_pet and 
                                cp2.id_unidade = :id_unidade: and 
                                data_execucao != "19000101" ) AND 
                hora_execucao = (select 
                                min(hora_execucao) from requisicao_procedimento rp2
                                inner join convenio_procedimento cp2 on rp2.id_convenio_procedimento = cp2.id 
                                where cp2.id_unidade = :id_unidade: and rp.id_pet = rp2.id_pet and data_execucao != "19000101") AND 
                cp.id_unidade = :id_unidade:
            order by data_execucao asc 
        ';
        $binds = [ 'id_unidade' => $idunidade, 'dtini' => $dtini, 'dtfim' => $dtfim ];
        $query = $this->db->query( $sql, $binds );
        $result_array = $query->getResultArray();
        return $result_array;
    }

    public function getRelatorioEstatisticoCadastroTutorList(int $dtini, int $dtfim, int $idunidade) {
        $sql = '
            SELECT 
  				c.id as id_tutor,
  				p3.telefone_1 as telefone,
  				e.numero as numero,
  				pf.nome,
  				pf.cpf,
  				c2.bairro,
  				c2.cidade,
  				c2.logradouro,
  				c2.cep,
  				rp.data_execucao
            FROM 
                requisicao_procedimento rp 
                inner join convenio_procedimento cp on cp.id = rp.id_convenio_procedimento 
                inner join procedimento p on cp.id_procedimento = p.id 
                inner join tipo_procedimento tp on tp.id = p.id_tipo_procedimento 
                inner join pet p2 on rp.id_pet = p2.id 
                inner join unidade u on cp.id_unidade = u.id
                inner join pet_cliente pc on p2.id = pc.id_pet
                inner join cliente c on pc.id_cliente = c.id
                inner join pessoa p3 on c.id_pessoa = p3.id
                inner join endereco e on  p3.id_endereco = e.id
                inner join cep c2 on e.cep = c2.id
                inner join pessoa_fisica pf on c.id_pessoa = pf.id_pessoa
            WHERE 
                tp.id = 2 and
                data_execucao >= :dtini: and 
                data_execucao <= :dtfim: and
                data_execucao = (select min(data_execucao) 
                                from requisicao_procedimento rp2 
                                inner join convenio_procedimento cp2 on rp2.id_convenio_procedimento = cp2.id  
                                where 
                                rp.id_pet = rp2.id_pet and 
                                data_execucao != "19000101" ) AND 
                hora_execucao = (select 
                                min(hora_execucao) from requisicao_procedimento rp2
                                inner join convenio_procedimento cp2 on rp2.id_convenio_procedimento = cp2.id 
                                where rp.id_pet = rp2.id_pet and data_execucao != "19000101") AND 
                cp.id_unidade = :id_unidade:
            order by data_execucao asc 
        ';
        $binds = [ 'id_unidade' => $idunidade, 'dtini' => $dtini, 'dtfim' => $dtfim ];
        $query = $this->db->query( $sql, $binds );
        $result_array = $query->getResultArray();
        return $result_array;
    }

    public function getRelatorioEstatisticoFaturamentoList(int $dtini, int $dtfim, int $idunidade) {
        $sql = '
            select
                cp.id, 
                cp.data_criacao as data_atualizacao, 
                cp.hora_criacao as hora_atualizacao,
                "2" as comanda_item_status_id ,
                cp.forma_pagamento_id as id_forma_pagamento, 
                fp.descricao , 
                cp.valor ,
                cf.criado_por as atualizado_por , 
                pf2.nome as responsavel, 
                c.id_unidade as id_unidade,
                c.id_pet, 
                c.id_cliente, 
                c.id_cliente as cliente_id,
                pf.nome as cliente,
                "0" as id_requisicao_procedimento, 
                "0" as id_convenio_procedimento
            from
                comanda_fechamento cf , comanda_pagamento cp , forma_pagamento fp  , comanda c , pet p,
                cliente cl, pessoa_fisica pf , pessoa_fisica pf2, usuario u
            where
                cf.data_criacao >= :dtini:
                and cf.data_criacao <= :dtfim:
                and cf.tipo_fechamento = "pagamento"
                and cf.id = cp.comanda_fechamento_id
                and cp.forma_pagamento_id  = fp.id
                and cf.comanda_id = c.id
                and c.id_unidade  = :id_unidade:
                and c.id_pet = p.id
                and c.id_cliente = cl.id
                and cl.id_pessoa = pf.id_pessoa
                and cf.criado_por = u.id
                and u.id_pessoa = pf2.id_pessoa
            order by cp.data_criacao asc, cp.hora_criacao asc
        ';
        $binds = [ 'id_unidade' => $idunidade, 'dtini' => $dtini, 'dtfim' => $dtfim ];
        $query = $this->db->query( $sql, $binds );
        $result_array['recebimentos'] = $query->getResultArray();

        $sql3 = '
            select
                cp.forma_pagamento_id as id_forma_pagamento , fp.descricao, sum(cp.valor) as total
            from 
                comanda c , comanda_fechamento cf , comanda_pagamento cp , forma_pagamento fp
            where
                cf.data_criacao >= :dtini:
                and cf.data_criacao <= ":dtfm:
                and cf.tipo_fechamento = "pagamento"
                and cf.comanda_id = c.id
                and c.id_unidade  = :id_unidade:
                and cf.id = cp.comanda_fechamento_id
                and cp.forma_pagamento_id  = fp.id
            group by cp.forma_pagamento_id
        ';
        $query = $this->db->query( $sql3, $binds );
        $result_array['recebimentos_total'] = $query->getResultArray();

        $sql3 = '
            select
                ext.id_tipo_extorno, ei.valor, ext.data_criacao, ext.hora_criacao, ext.observacao,
                tpe.descricao as tipo_estorno, pf.nome as executor, p.descricao as item, c.id_pet as pet_id, pt.nome as pet, c.id_cliente as cliente_id, pf2.nome as cliente 
            from
                extorno ext, tipo_extorno tpe, usuario usr, pessoa_fisica pf, comanda c, extorno_item ei, comanda_item ci, procedimento p, pet pt, cliente cl, pessoa_fisica pf2
            where 
                ext.id_tipo_extorno = tpe.id
                and ext.criado_por = usr.id
                and usr.id_pessoa = pf.id_pessoa
                and c.id = ext.id_comanda
                and c.id_pet = pt.id 
                and c.id_cliente = cl.id
                and cl.id_pessoa = pf2.id_pessoa 
                and ext.id = ei.extorno_id
                and ei.comanda_item_id = ci.id
                and ci.id_procedimento = p.id
                and ext.data_criacao >= :dtini:
                and ext.data_criacao <= :dtfim:
                and c.id_unidade = :id_unidade:
        ';
        $query = $this->db->query( $sql3, $binds );
        $result_array['estornos'] = $query->getResultArray();



        return $result_array;
    }




    public function persistDocumentoGerado($url, $id_pet, $id_cliente, $descricao): DAOResponse {

        $agenda_model = new DocumentoGeradoModel();
        $this->db->transStart();
        $insert_status = $agenda_model->registerDocumentoGerado( $url, $id_pet, $id_cliente, $descricao );
        $error = $this->db->error();
        $dao_response = new DAOResponse();
        if ($error && $error ['code']) {
            $dao_response->setStatus( $error ['code'] );
            $dao_response->setErrors( $error );
        } else {
            if ($insert_status) {
                $this->db->transComplete();
                $dao_response->setStatus( DAOResponseInterface::SUCESS );
            } else {
                $dao_response->setStatus( DAOResponseInterface::DATABASE_CONNECTION_ERROR );
            }
        }
        return $dao_response;

    }

}