<?php


namespace App\DAO;



use App\DAO\DAOResponse\DAOResponse;
use App\DAO\Pagination\Pagination;
use App\Mappers\FilaEspecialidadeMapper;
use App\Services\JWT\UsuarioLogado;
use App\Utils\Collections\QueryFilterCollection;
use App\Utils\Collections\QueryOrderCollection;
use Exception;

class FilaEspecialidadeDAO extends DAO
{
    public function getFilaEspecialidadeList (?Pagination $pagination, ?QueryFilterCollection $query_filter_collection, ?QueryOrderCollection $query_order_collection = null) : DAOResponse {
        $sql = '
            SELECT 
                requisicao_procedimento.id as id_requisicao_procedimento,
                cliente.id as id_cliente,
                pessoa_fisica.id_pessoa as id_pessoa,
                pessoa_fisica.nome as nome_pessoa,
                pet.id as id_pet,
                pet.data_nascimento as data_nascimento_pet,
                pet.nome as nome_pet,
                raca.nome as nome_raca,
                especie.nome as nome_especie
            FROM 
                requisicao_procedimento, 
                requisicao_sala_video,
                agendamento_especialidade,
                agenda_especialidade,
                pet,
                raca,
                especie,
                pet_cliente,
                cliente,
                pessoa_fisica
            WHERE 
                requisicao_procedimento.id = requisicao_sala_video.id_requisicao_procedimento AND 
                requisicao_procedimento.id = agendamento_especialidade.id_requisicao_procedimento AND 
                agendamento_especialidade.id_agenda_especialidade = agenda_especialidade.id AND
                requisicao_procedimento.id_pet = pet.id AND
                pet.id_raca = raca.id AND
                especie.id = raca.id_especie AND 
                pet.id = pet_cliente.id_pet AND 
                pet_cliente.id_cliente = cliente.id AND
                cliente.id_pessoa = pessoa_fisica.id_pessoa AND 
                ((requisicao_procedimento.id_medico = :id_medico: and requisicao_procedimento.id_consulta is null) OR 
                (requisicao_procedimento.id_medico is null and requisicao_procedimento.id_consulta is null))
        ';
        $binds = ['id_medico' => UsuarioLogado::getUsuarioId()];
        return $this->getDAOResponseFromPaginatedSelect($binds, $pagination, $query_filter_collection, $query_order_collection, $sql, function (array $result_array) {
            return FilaEspecialidadeMapper::getFilaEspecialidadeDetailsVMCollectionFromArray($result_array);
        });
    }
    public function getFilaEspecialidade (QueryFilterCollection $query_filter_collection) : DAOResponse {
        $sql = '
            SELECT 
                requisicao_procedimento.id as id_requisicao_procedimento,
                cliente.id as id_cliente,
                pessoa_fisica.id_pessoa as id_pessoa,
                pessoa_fisica.nome as nome_pessoa,
                pet.id as id_pet,
                pet.data_nascimento as data_nascimento_pet,
                pet.nome as nome_pet,
                raca.nome as nome_raca,
                especie.nome as nome_especie
            FROM 
                requisicao_procedimento, 
                requisicao_sala_video,
                agendamento_especialidade,
                agenda_especialidade,
                pet,
                raca,
                especie,
                pet_cliente,
                cliente,
                pessoa_fisica
            WHERE 
                requisicao_procedimento.id = requisicao_sala_video.id_requisicao_procedimento AND 
                requisicao_procedimento.id = agendamento_especialidade.id_requisicao_procedimento AND 
                agendamento_especialidade.id_agenda_especialidade = agenda_especialidade.id AND
                requisicao_procedimento.id_pet = pet.id AND
                pet.id_raca = raca.id AND
                especie.id = raca.id_especie AND 
                pet.id = pet_cliente.id_pet AND 
                pet_cliente.id_cliente = cliente.id AND
                cliente.id_pessoa = pessoa_fisica.id_pessoa AND 
                requisicao_procedimento.id_medico is null
            order by agenda_especialidade.id asc
        ';
        $binds = [];
        return $this->getDAOResponseFromUniqueRowSelect($binds, $query_filter_collection, $sql, function (array $result_array) {
            return FilaEspecialidadeMapper::getFilaEspecialidadeDetailsVMFromArray($result_array[0]);
        });
    }

    public function getFilaClienteList (?Pagination $pagination, ?QueryFilterCollection $query_filter_collection, ?QueryOrderCollection $query_order_collection = null) : DAOResponse {
        $sql = '
            SELECT 
                requisicao_procedimento.id as id_requisicao_procedimento,
                requisicao_procedimento.id_medico as id_medico,
				agenda_especialidade.data as agendamento_data,
				agenda_especialidade.hora_inicio as agendamento_hora,
				agendamento_especialidade.data_criacao as data_criacao,
				agendamento_especialidade.hora_criacao as hora_criacao,
                cliente.id as id_cliente,
                pessoa_fisica.id_pessoa as id_pessoa,
                pessoa_fisica.nome as nome_pessoa,
                pet.id as id_pet,
                pet.data_nascimento as data_nascimento_pet,
                pet.nome as nome_pet,
                raca.nome as nome_raca,
                especie.nome as nome_especie,
				requisicao_sala_video.available as status_sala
            FROM 
                requisicao_procedimento, 
                requisicao_sala_video,
                agendamento_especialidade,
                agenda_especialidade,
                pet,
                raca,
                especie,
                pet_cliente,
                cliente,
                pessoa_fisica,
                agendamento,
                agendamento_voucher,
                voucher,
                loja_compra
            WHERE 
                requisicao_procedimento.id = requisicao_sala_video.id_requisicao_procedimento AND 
                requisicao_procedimento.id = agendamento_especialidade.id_requisicao_procedimento AND 
                agendamento_especialidade.id_agenda_especialidade = agenda_especialidade.id AND
                agendamento.id_requisicao = requisicao_procedimento.id AND
                agendamento_voucher.id_agendamento = agendamento.id AND 
                voucher.id = agendamento_voucher.id_voucher AND 
                voucher.id_compra = loja_compra.id AND 
                loja_compra.id_status = 3 AND
                requisicao_procedimento.id_pet = pet.id AND
                pet.id_raca = raca.id AND
                especie.id = raca.id_especie AND 
                pet.id = pet_cliente.id_pet AND 
                pet_cliente.id_cliente = cliente.id AND
                cliente.id_pessoa = pessoa_fisica.id_pessoa AND 
                requisicao_procedimento.id_consulta is null AND 
                requisicao_sala_video.available < 2
        ';
        return $this->getDAOResponseFromPaginatedSelect([], $pagination, $query_filter_collection, $query_order_collection, $sql, function (array $result_array) {
            return FilaEspecialidadeMapper::getFilaClienteDetailsVMCollectionFromArray($result_array);
        });
    }

}