<?php

namespace App\DAO;

use App\DAO\DAOResponse\DAOResponse;
use App\DAO\DAOResponse\DAOResponseInterface;
use App\Entities\CEP\CEP;
use App\Mappers\CEPMapper;
use App\Mappers\DashboardMapper;
use App\Models\CEPModel;
use App\Services\LogService;
use App\Utils\Collections\GeneralCollection;
use App\Utils\Collections\QueryFilterCollection;
use App\Utils\Collections\QueryOrderCollection;

class DashboardDAO extends DAO {

	public function getAgendasDoDia(int $id_medico, QueryFilterCollection $query_filter_collection): DAOResponse {

		$sql = "
            SELECT 
                agendamento.id as id_agendamento,
				agendamento.id_requisicao as id_requisicao,
                consulta.id as id_consulta,
                paciente.id as paciente_id,
                tipo_procedimento.descricao as tipo_procedimento,
                procedimento.id as id_procedimento,
                procedimento.descricao as procedimento,
                pessoa_fisica.nome as nome,
                pessoa.telefone_1 as telefone_1,
                SUBSTRING(agenda.`data`, 1, 10) as `data`,
                SUBSTRING(agenda.hora_inicio, 1, 5) as hora_inicio,
                SUBSTRING(agenda.hora_final, 1, 5) as hora_final,
                agendamento.atrasado as atrasado,
                tipo_procedimento.id as id_tipo_procedimento,
                agendamento_pet.id_pet as id_pet,
                pet.nome as nome_pet,
                cliente.id as id_cliente,
                requisicao_sala_video.available as status_sala
            FROM agenda
            INNER JOIN agendamento ON agendamento.id_agenda = agenda.id
            INNER JOIN paciente ON paciente.id = agendamento.id_paciente
            INNER JOIN pessoa ON paciente.id_pessoa = pessoa.id
            INNER JOIN pessoa_fisica ON pessoa_fisica.id_pessoa = pessoa.id
            LEFT JOIN consulta ON consulta.id_agendamento = agendamento.id
            INNER JOIN procedimento ON agendamento.id_procedimento = procedimento.id
            INNER JOIN tipo_procedimento ON agenda.id_tipo_procedimento = tipo_procedimento.id
            INNER JOIN agendamento_pet on agendamento_pet.id_agendamento = agendamento.id
            INNER JOIN pet on pet.id = agendamento_pet.id_pet
            INNER JOIN cliente on pessoa.id = cliente.id_pessoa
            LEFT JOIN requisicao_sala_video on requisicao_sala_video.id_requisicao_procedimento = agendamento.id_requisicao
            WHERE
                agenda.`data` = SUBSTRING(now(), 1, 10) AND
                agenda.id_medico = :id_medico: AND
                (agendamento.cancelado_em = '1900-01-01 00:00:00' OR agendamento.cancelado_em IS NULL)
            ORDER BY hora_inicio
        ";
		$binds = [ 
			'id_medico' => $id_medico ];
		$query_order_collection = new QueryOrderCollection();
		return $this->getDAOResponseFromMultipleRowSelect( $sql,
			function (array $response_array): GeneralCollection {
				return DashboardMapper::getDashboardMedicoVMCollectionFromArray( $response_array );
			}, $query_filter_collection, $query_order_collection, $binds );

	}

	public function getAgendasSearch(int $id_medico, QueryFilterCollection $query_filter_collection, $query_order_collection): DAOResponse {

		$sql = "
            SELECT 
                agendamento.id as id_agendamento,
				agendamento.id_requisicao as id_requisicao,
                consulta.id as id_consulta,
				agendamento.id_requisicao as id_requisicao,
                paciente.id as paciente_id,
                tipo_procedimento.descricao as tipo_procedimento,
                procedimento.id as id_procedimento,
                procedimento.descricao as procedimento,
                pessoa_fisica.nome as nome,
                pessoa.telefone_1 as telefone_1,
                SUBSTRING(agenda.`data`, 1, 10) as `data`,
                SUBSTRING(agenda.hora_inicio, 1, 5) as hora_inicio,
                SUBSTRING(agenda.hora_final, 1, 5) as hora_final,
                agendamento.atrasado as atrasado,
                tipo_procedimento.id as id_tipo_procedimento,
                agendamento_pet.id_pet as id_pet,
                pet.nome as nome_pet,
                cliente.id as id_cliente,
                requisicao_sala_video.available as status_sala
            FROM agenda
            INNER JOIN agendamento ON agendamento.id_agenda = agenda.id
            INNER JOIN paciente ON paciente.id = agendamento.id_paciente
            INNER JOIN pessoa ON paciente.id_pessoa = pessoa.id
            INNER JOIN pessoa_fisica ON pessoa_fisica.id_pessoa = pessoa.id
            LEFT JOIN consulta ON consulta.id_agendamento = agendamento.id
            INNER JOIN procedimento ON agendamento.id_procedimento = procedimento.id
            INNER JOIN tipo_procedimento ON agenda.id_tipo_procedimento = tipo_procedimento.id
            INNER JOIN agendamento_pet on agendamento_pet.id_agendamento = agendamento.id
            INNER JOIN pet on pet.id = agendamento_pet.id_pet  
            INNER JOIN cliente on pessoa.id = cliente.id_pessoa
            LEFT JOIN requisicao_sala_video on requisicao_sala_video.id_requisicao_procedimento = agendamento.id_requisicao
            WHERE
                agenda.id_medico = :id_medico: AND
                (
                    agendamento.cancelado_em = '1900-01-01 00:00:00' 
                    OR agendamento.cancelado_em = '0000-00-00 00:00:00' 
                    OR agendamento.cancelado_em is null
                )
        ";
		$binds = [ 
			'id_medico' => $id_medico ];
		return $this->getDAOResponseFromMultipleRowSelect( $sql,
			function (array $response_array): GeneralCollection {
				return DashboardMapper::getDashboardMedicoVMCollectionFromArray( $response_array );
			}, $query_filter_collection, $query_order_collection, $binds );

	}

	public function getHorariosAgendados(int $id_paciente): DAOResponse {

		$sql = <<<SQL
		    SELECT 
		        agendamento.id as id_agendamento, agendamento.id_requisicao as id_requisicao,
		        tipo_procedimento.descricao as descricao_tipo_procedimento,
		        procedimento.descricao as descricao_procedimento,
		        SUBSTRING(agenda.hora_inicio, 1, 5) as hora_inicio,
		        SUBSTRING(agenda.hora_final, 1, 5) as hora_final,
		        agenda.data as data
		    FROM agendamento 
		    INNER JOIN agenda ON agenda.id = agendamento.id_agenda
		    INNER JOIN tipo_procedimento ON tipo_procedimento.id = agenda.id_tipo_procedimento
		    INNER JOIN procedimento ON agendamento.id_procedimento = procedimento.id
		    LEFT JOIN consulta ON consulta.id_agendamento = agendamento.id
		    WHERE
		        consulta.id_agendamento IS NULL AND
		        agendamento.id_paciente = :id_paciente:
		    ORDER BY agenda.hora_inicio
		SQL;
		$binds = [ 
			'id_paciente' => $id_paciente ];
		$query_order_collection = new QueryOrderCollection();
		$query_filter_collection = new QueryFilterCollection();
		return $this->getDAOResponseFromMultipleRowSelect( $sql,
			function (array $response_array): GeneralCollection {
				// var_dump($response_array); die;
				return DashboardMapper::getDashboardPacienteVMCollectionFromArray( $response_array );
			}, $query_filter_collection, $query_order_collection, $binds );

	}









    public function getAgendasDoDiaTelevet(int $id_medico, QueryFilterCollection $query_filter_collection): DAOResponse {

        $sql = "
            SELECT 
                agendamento.id as id_agendamento,
				agendamento.id_requisicao as id_requisicao,
                consulta.id as id_consulta,
                paciente.id as paciente_id,
                tipo_procedimento.descricao as tipo_procedimento,
                procedimento.id as id_procedimento,
                procedimento.descricao as procedimento,
                pessoa_fisica.nome as nome,
                pessoa.telefone_1 as telefone_1,
                SUBSTRING(agenda.`data`, 1, 10) as `data`,
                SUBSTRING(agenda.hora_inicio, 1, 5) as hora_inicio,
                SUBSTRING(agenda.hora_final, 1, 5) as hora_final,
                agendamento.atrasado as atrasado,
                tipo_procedimento.id as id_tipo_procedimento,
                agendamento_pet.id_pet as id_pet,
                pet.nome as nome_pet,
                cliente.id as id_cliente,
                requisicao_sala_video.available as status_sala
            FROM agenda
            INNER JOIN agendamento ON agendamento.id_agenda = agenda.id
            INNER JOIN paciente ON paciente.id = agendamento.id_paciente
            INNER JOIN pessoa ON paciente.id_pessoa = pessoa.id
            INNER JOIN pessoa_fisica ON pessoa_fisica.id_pessoa = pessoa.id
            LEFT JOIN consulta ON consulta.id_agendamento = agendamento.id
            INNER JOIN procedimento ON agendamento.id_procedimento = procedimento.id
            INNER JOIN tipo_procedimento ON agenda.id_tipo_procedimento = tipo_procedimento.id
            INNER JOIN agendamento_pet on agendamento_pet.id_agendamento = agendamento.id
            INNER JOIN pet on pet.id = agendamento_pet.id_pet
            INNER JOIN cliente on pessoa.id = cliente.id_pessoa
            INNER JOIN agendamento_voucher on agendamento.id = agendamento_voucher.id_agendamento 
            INNER JOIN voucher on agendamento_voucher.id_voucher = voucher.id
            INNER JOIN loja_compra on voucher.id_compra = loja_compra.id
            LEFT JOIN requisicao_sala_video on requisicao_sala_video.id_requisicao_procedimento = agendamento.id_requisicao
            WHERE
            	loja_compra.id_status = 3 AND
                agenda.`data` = SUBSTRING(now(), 1, 10) AND
                agenda.id_medico = :id_medico: AND
                (agendamento.cancelado_em = '1900-01-01 00:00:00' OR agendamento.cancelado_em IS NULL)
            ORDER BY hora_inicio
        ";
        $binds = [
            'id_medico' => $id_medico ];
        $query_order_collection = new QueryOrderCollection();
        return $this->getDAOResponseFromMultipleRowSelect( $sql,
            function (array $response_array): GeneralCollection {
                return DashboardMapper::getDashboardMedicoVMCollectionFromArray( $response_array );
            }, $query_filter_collection, $query_order_collection, $binds );

    }

    public function getAgendasSearchTelevet(int $id_medico, QueryFilterCollection $query_filter_collection, $query_order_collection): DAOResponse {

        $sql = "
            SELECT 
                agendamento.id as id_agendamento,
				agendamento.id_requisicao as id_requisicao,
                consulta.id as id_consulta,
				agendamento.id_requisicao as id_requisicao,
                paciente.id as paciente_id,
                tipo_procedimento.descricao as tipo_procedimento,
                procedimento.id as id_procedimento,
                procedimento.descricao as procedimento,
                pessoa_fisica.nome as nome,
                pessoa.telefone_1 as telefone_1,
                SUBSTRING(agenda.`data`, 1, 10) as `data`,
                SUBSTRING(agenda.hora_inicio, 1, 5) as hora_inicio,
                SUBSTRING(agenda.hora_final, 1, 5) as hora_final,
                agendamento.atrasado as atrasado,
                tipo_procedimento.id as id_tipo_procedimento,
                agendamento_pet.id_pet as id_pet,
                pet.nome as nome_pet,
                cliente.id as id_cliente,
                requisicao_sala_video.available as status_sala
            FROM agenda
            INNER JOIN agendamento ON agendamento.id_agenda = agenda.id
            INNER JOIN paciente ON paciente.id = agendamento.id_paciente
            INNER JOIN pessoa ON paciente.id_pessoa = pessoa.id
            INNER JOIN pessoa_fisica ON pessoa_fisica.id_pessoa = pessoa.id
            LEFT JOIN consulta ON consulta.id_agendamento = agendamento.id
            INNER JOIN procedimento ON agendamento.id_procedimento = procedimento.id
            INNER JOIN tipo_procedimento ON agenda.id_tipo_procedimento = tipo_procedimento.id
            INNER JOIN agendamento_pet on agendamento_pet.id_agendamento = agendamento.id
            INNER JOIN pet on pet.id = agendamento_pet.id_pet  
            INNER JOIN cliente on pessoa.id = cliente.id_pessoa
            INNER JOIN agendamento_voucher on agendamento.id = agendamento_voucher.id_agendamento 
            INNER JOIN voucher on agendamento_voucher.id_voucher = voucher.id
            INNER JOIN loja_compra on voucher.id_compra = loja_compra.id
            LEFT JOIN requisicao_sala_video on requisicao_sala_video.id_requisicao_procedimento = agendamento.id_requisicao
            WHERE
            	loja_compra.id_status = 3 AND
                agenda.id_medico = :id_medico: AND
                (
                    agendamento.cancelado_em = '1900-01-01 00:00:00' 
                    OR agendamento.cancelado_em = '0000-00-00 00:00:00' 
                    OR agendamento.cancelado_em is null
                )
        ";
        $binds = [
            'id_medico' => $id_medico ];
        return $this->getDAOResponseFromMultipleRowSelect( $sql,
            function (array $response_array): GeneralCollection {
                return DashboardMapper::getDashboardMedicoVMCollectionFromArray( $response_array );
            }, $query_filter_collection, $query_order_collection, $binds );

    }


}