<?php

namespace App\Controllers;

use App\DAO\Filter\QueryFilter;
use App\DAO\Filter\QueryFilterTranslator;
use App\DAO\Order\QueryOrderTranslator;
use App\Services\FilaEspecialidadeService;
use App\Services\JWT\UsuarioLogado;
use App\Services\ServiceResponse\ServiceResponseInterface;
use App\Utils\Collections\QueryFilterCollection;
use App\Utils\Collections\QueryOrderCollection;
use CodeIgniter\HTTP\Response;
use CodeIgniter\HTTP\ResponseInterface;

class FilaEspecialidadeController extends BaseController {

	public function getFilaEspecialidadeList(): Response {

		$pagination = $this->getPaginationFromRequest();
		if ($_GET ['sort'] === null) {
			$_GET ['sort'] = "id";
		}
		$query_filter_collection = new QueryFilterCollection( $_GET, QueryFilterTranslator::fila_especialidade() );
		$query_order_collection = new QueryOrderCollection( $_GET, QueryOrderTranslator::fila_especialidade() );
		$erro_service_response = (new FilaEspecialidadeService())->getFilaEspecialidadeList( $pagination, $query_filter_collection, $query_order_collection );
		$response_messages = [ 
			ServiceResponseInterface::SUCESS => [ 
				'code' => ResponseInterface::HTTP_OK,
				'message' => 'Os dados dos erros foram encontrados com sucesso.'
			],
			ServiceResponseInterface::RECORD_NOT_FOUND => [ 
				'code' => ResponseInterface::HTTP_PARTIAL_CONTENT,
				'message' => 'Nenhum registro foi encontrado.'
			],
			ServiceResponseInterface::SERVICE_INTERNAL_ERROR => [ 
				'code' => ResponseInterface::HTTP_INTERNAL_SERVER_ERROR,
				'message' => 'Erro interno do servidor.'
			],
			ServiceResponseInterface::DATABASE_CONNECTION_ERROR => [ 
				'code' => ResponseInterface::HTTP_INTERNAL_SERVER_ERROR,
				'message' => 'Erro interno do servidor.'
			]
		];
		return $this->getResponse( $erro_service_response, $response_messages );

	}

	public function searchFilaEspecialidadeByID(int $id_fila): Response {

		$query_filter = QueryFilter::builder()->setTable( 'requisicao_procedimento' )
			->setNameParam( 'id' )
			->setValue( $id_fila )
			->setIsExact( true )
			->build();
		$erro_service_response = (new FilaEspecialidadeService())->getFilaEspecialidade( $query_filter );
		$response_messages = [ 
			ServiceResponseInterface::SUCESS => [ 
				'code' => ResponseInterface::HTTP_OK,
				'message' => 'Os dados do exame foram encontrados com sucesso.'
			],
			ServiceResponseInterface::RECORD_NOT_FOUND => [ 
				'code' => ResponseInterface::HTTP_PARTIAL_CONTENT,
				'message' => 'Nenhum registro foi encontrado.'
			],
			ServiceResponseInterface::SERVICE_INTERNAL_ERROR => [ 
				'code' => ResponseInterface::HTTP_INTERNAL_SERVER_ERROR,
				'message' => 'Erro interno do servidor.'
			],
			ServiceResponseInterface::DATABASE_CONNECTION_ERROR => [ 
				'code' => ResponseInterface::HTTP_INTERNAL_SERVER_ERROR,
				'message' => 'Erro interno do servidor.'
			]
		];
		return $this->getResponse( $erro_service_response, $response_messages );

	}

	public function getFilaClienteList(): Response {

		$pagination = $this->getPaginationFromRequest();

		if ($_GET ['sort'] === null) {
			$_GET ['sort'] = "id";
		}

		$query_filter_collection = new QueryFilterCollection( $_GET, QueryFilterTranslator::fila_cliente() );
		$query_order_collection = new QueryOrderCollection( $_GET, QueryOrderTranslator::fila_cliente() );
		$erro_service_response = (new FilaEspecialidadeService())->getFilaClienteList( $pagination, $query_filter_collection, $query_order_collection );

		$response_messages = [ 
			ServiceResponseInterface::SUCESS => [ 
				'code' => ResponseInterface::HTTP_OK,
				'message' => 'Os dados dos erros foram encontrados com sucesso.'
			],
			ServiceResponseInterface::RECORD_NOT_FOUND => [ 
				'code' => ResponseInterface::HTTP_PARTIAL_CONTENT,
				'message' => 'Nenhum registro foi encontrado.'
			],
			ServiceResponseInterface::SERVICE_INTERNAL_ERROR => [ 
				'code' => ResponseInterface::HTTP_INTERNAL_SERVER_ERROR,
				'message' => 'Erro interno do servidor.'
			],
			ServiceResponseInterface::DATABASE_CONNECTION_ERROR => [ 
				'code' => ResponseInterface::HTTP_INTERNAL_SERVER_ERROR,
				'message' => 'Erro interno do servidor.'
			]
		];
		return $this->getResponse( $erro_service_response, $response_messages );

	}

	public function atenderFilaEspecialidadeMedico() {

		if (!( int ) $_POST ['id_requisicao_procedimento']) {
			return $this->response->setStatusCode( 400 )
				->setJSON( [ 
				'Informe a requisicao procedimento.'
			] );
		}

		$id_requisicao = ( int ) $_POST ['id_requisicao_procedimento'];

		if (!( int ) $_POST ['id_medico']) {
			return $this->response->setStatusCode( 400 )
				->setJSON( [ 
				'Informe o id do médico.'
			] );
		}
		$idMedico = ( int ) $_POST ['id_medico'];

		$sqlDadosPaciente = <<<SQL
		    SELECT 
		        requisicao_procedimento.id as id_requisicao_procedimento,
		        requisicao_procedimento.id_pet as id_pet,
		        requisicao_procedimento.id_convenio_procedimento as id_convenio_procedimento,
		        requisicao_procedimento.id_medico as id_medico,
		        convenio_procedimento.id_procedimento as id_procedimento,
		        procedimento.id_tipo_procedimento as id_tipo_procedimento
		        from requisicao_procedimento 
		        inner join convenio_procedimento on requisicao_procedimento.id_convenio_procedimento = convenio_procedimento.id
		        inner join procedimento on procedimento.id = convenio_procedimento.id_procedimento 
		    WHERE 
		        requisicao_procedimento.id = :id_requisicao_procedimento:
		    limit 1
		SQL;

		$binds = [ 
			'id_requisicao_procedimento' => $id_requisicao
		];

		$conn = db_connect();
		$query = $conn->query( $sqlDadosPaciente, $binds )
			->getResultArray();
		if (count( $query )) {
			$query = $query [0];
		} else {
			return $this->response->setStatusCode( 419 )
				->setJSON( [ 
				'message' => 'Essa requisicao de procedimento não existe.'
			] );
		}

		if ($query ['id_medico'] != null and $query ['id_medico'] != $idMedico) {
			return $this->response->setStatusCode( 405 )
				->setJSON( [ 
				'message' => 'Essa requisicao já foi iniciada por outro médico.'
			] );
		}

		if ($query ['id_medico'] != null and $query ['id_medico'] == $idMedico) {
			return $this->response->setStatusCode( 204 )
				->setJSON( [ 
				'message' => 'Essa consulta já foi iniciada por você, acesse a sala.'
			] );
		}

		$bodyRequest = [ 
			'petId' => ( int ) $query ['id_pet'],
			'id_requisicao_procedimento' => ( int ) $_POST ['id_requisicao_procedimento'],
			'unidadeId' => 24,
			'medicoId' => ( int ) $_POST ['id_medico'],
			'tipoProcedimentoId' => ( int ) $query ['id_tipo_procedimento'],
			'procedimentoId' => ( int ) $query ['id_procedimento']
		];

		if (!$bodyRequest ['petId']) {
			return $this->response->setStatusCode( 400 )
				->setJSON( [ 
				'message' => 'Informe o pet.'
			] );
		}
		if (!$bodyRequest ['unidadeId']) {
			return $this->response->setStatusCode( 400 )
				->setJSON( [ 
				'message' => 'Informe a unidade.'
			] );
		}
		if (!$bodyRequest ['medicoId']) {
			return $this->response->setStatusCode( 400 )
				->setJSON( [ 
				'message' => 'Informe o médico.'
			] );
		}

		if (!$bodyRequest ['tipoProcedimentoId']) {
			return $this->response->setStatusCode( 400 )
				->setJSON( [ 
				'Informe o tipo de procedimento.'
			] );
		}
		if (!$bodyRequest ['procedimentoId']) {
			return $this->response->setStatusCode( 400 )
				->setJSON( [ 
				'Informe o procedimento.'
			] );
		}

		$sql_agd_esp = <<<SQL
			select id_agenda_especialidade
			from agendamento_especialidade aep
			where aep.id_requisicao_procedimento  = :id_requisicao_procedimento:
		SQL;
		
		$bind_agd_esp = [ 
			'id_requisicao_procedimento' => ( int ) $_POST ['id_requisicao_procedimento']
		];

		$conn_agd_esp = db_connect();
		$result_agd_esp = $conn_agd_esp->query( $sql_agd_esp, $bind_agd_esp )
			->getResultArray();
		$errors_agd_esp = $conn_agd_esp->error();

		if ($errors_agd_esp ['code'] != 0) {
			return $this->response->setStatusCode( 400 )
				->setJSON( [ 
				'message' => 'Agendamento não encontrado para a requisição informada.'
			] );
		}

		if (count( $result_agd_esp ) < 1) {
			return $this->response->setStatusCode( 400 )
				->setJSON( [ 
				'message' => 'Agendamento não encontrado para a requisição informada.'
			] );
		}

		$idAgendaEspecialidade = $result_agd_esp [0] ['id_agenda_especialidade'];

		$update_medico_agd_esp = <<<SQL
			update agenda_especialidade
			set id_medico = :id_medico:
			where id = :id_agenda_especialidade: and id_medico is null
		SQL;

		$bind_upd_medico_agd_esp = [ 
			'id_medico' => $idMedico,
			'id_agenda_especialidade' => $idAgendaEspecialidade
		];

		$conn_upd_medico_agd_esp = db_connect();
		$conn_upd_medico_agd_esp->query( $update_medico_agd_esp, $bind_upd_medico_agd_esp )->numRows;
		$errors_upd_medico_agd_esp = $conn_upd_medico_agd_esp->error();

		if ($errors_upd_medico_agd_esp ['code'] != 0) {
			return $this->response->setStatusCode( 400 )
				->setJSON( [ 
				'message' => 'Não foi possivel iniciar esse atendimento.'
			] );
		}
		$update_medico_affectrow = $conn_upd_medico_agd_esp->affectedRows();

		if ($update_medico_affectrow == 0) {
			return $this->response->setStatusCode( 405 )
				->setJSON( [ 
				'message' => 'Agendamento já em atendimento por outro médico.'
			] );
		}

		$sqlDadosPaciente = <<<SQL
		    SELECT 
		        p.id as pet_id,
		        c.id as cliente_id,
		        pac.id as paciente_id
		    from pet p
		    inner join pet_cliente pc on pc.id_pet = p.id 
		    inner join cliente c on c.id = pc.id_cliente 
		    inner join pessoa pes on pes.id = c.id_pessoa 
		    inner join paciente pac on pac.id_pessoa = pes.id 
		    WHERE 
		        p.id = :pet_id:
		    limit 1
		SQL;

		$binds = [ 
			'pet_id' => $bodyRequest ['petId']
		];

		$query = $conn->query( $sqlDadosPaciente, $binds )
			->getResultArray();
		if (count( $query )) {
			$query = $query [0];
		} else {
			die( 'Esse pet não existe.' );
		}
		$bodyRequest ['pacienteId'] = ( int ) $query ['paciente_id'];
		$bodyRequest ['clienteId'] = ( int ) $query ['cliente_id'];
		$sqlProximaAgendaLivre = <<<SQL
		    select a.id as agenda_id from agenda a 
		    left join agendamento ag on ag.id_agenda = a.id
		    where 1=1 
		        and a.id_medico = :medico_id:
		        and ag.id is null
		        and left(now(),10) =  a.`data` 
		    limit 1
		SQL;

		$agendaLivreQuery = $conn->query( $sqlProximaAgendaLivre, [ 
			'medico_id' => $bodyRequest ['medicoId']
		] )
			->getResultArray();
		if (count( $agendaLivreQuery ) > 0) {
			$agendaId = ( int ) $agendaLivreQuery [0] ['agenda_id'];
		} else {
			$sqlInsertAgenda = <<<SQL
			    insert into agenda (codigo,id_medico,data,hora_inicio, hora_final, id_tipo_procedimento, adicionado_por, alterado_por, criado_em,alterado_em,id_unidade, id_assistente)
			    values (
			        :codigo:,
			        :id_medico:,
			        :data:,
			        :hora_inicio:,
			        :hora_final:,
			        :id_tipo_procedimento:,
			        :adicionado_por:,
			        :alterado_por:,
			        :criado_em:,
			        :alterado_em:,
			        :id_unidade:, 
			        :id_assistente:	
			    )
			SQL;
			$currdate = date( 'Y-m-d' );
			$bindsInsertAgenda = [ 
				'codigo' => $bodyRequest ['medicoId'] . '-' . $bodyRequest ['unidadeId'] . '-' . date( 'Ymd' ) . '00000000' . date( 'Ymdhis' ),
				'id_medico' => $bodyRequest ['medicoId'],
				'data' => $currdate,
				'hora_inicio' => date( 'H:i:s' ),
				'hora_final' => date( 'H:i:s' ),
				'id_tipo_procedimento' => $bodyRequest ['tipoProcedimentoId'],
				'adicionado_por' => UsuarioLogado::getUsuarioId(),
				'alterado_por' => null,
				'criado_em' => date( 'Y-m-d H:i:s' ),
				'alterado_em' => null,
				'id_unidade' => $bodyRequest ['unidadeId'],
				'id_assistente' => null
			];
			$conn->query( $sqlInsertAgenda, $bindsInsertAgenda );
			$agendaId = $conn->insertID();
		}

		$agendamentoCriacaoSql = <<<SQL
			insert into agendamento 
				(id_agenda, id_cliente, id_paciente, id_procedimento, id_requisicao,  
				codigo, cancelado_em, adicionado_por, alterado_por, alterado_em, criado_em, atrasado)
			values 
				( :id_agenda:, :id_cliente:, :id_paciente:, :id_procedimento:, :id_requisicao:,
				:codigo:, :cancelado_em:, :adicionado_por:, :alterado_por:, :alterado_em:,
				:criado_em:,:atrasado:)
		SQL;

		$binds = [ 
			'id_agenda' => $agendaId,
			'id_cliente' => $bodyRequest ['clienteId'],
			'id_paciente' => $bodyRequest ['pacienteId'],
			'id_procedimento' => $bodyRequest ['procedimentoId'],
			'id_requisicao' => $id_requisicao,
			'codigo' => $agendaId . '_' . date( 'Ymd' ) . ' ' . '00:00:00',
			'cancelado_em' => null,
			'adicionado_por' => UsuarioLogado::getUsuarioId(),
			'alterado_por' => null,
			'alterado_em' => null,
			'criado_em' => date( 'Y-m-d H:i:s' ),
			'atrasado' => 0
		];

		$sqlAgendamentoPet = <<<SQL
		    insert into agendamento_pet (id_agendamento, id_pet)
		    values (:id_agendamento:, :id_pet:)
		SQL;

		$sqlVinculaMedico = <<<SQL
		    update requisicao_procedimento set id_medico = :id_medico:
		    where id = :id_requisicao_procedimento:
		SQL;

		$conn = db_connect();
		$conn->transBegin();
		$conn->query( $agendamentoCriacaoSql, $binds );
		$agendamentoId = $conn->insertID();

		$conn->query( $sqlAgendamentoPet, [ 
			'id_agendamento' => $agendamentoId,
			'id_pet' => $bodyRequest ['petId']
		] );

		$conn->query( $sqlVinculaMedico,
			[ 
				'id_medico' => $bodyRequest ['medicoId'],
				'id_requisicao_procedimento' => $bodyRequest ['id_requisicao_procedimento']
			] );
		if ($agendamentoId) {
			$conn->transCommit();
		}
		return $this->response->setStatusCode( 200 )
			->setJSON( [ 
			'message' => 'O paciente foi agendado com sucesso..',
			'data' => $agendamentoId
		] );

	}










    public function atenderFilaMultiplaEspecialidadeMedico() {

        if (!( int ) $_POST ['id_requisicao_procedimento']) {
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'Informe a requisicao procedimento.'
                ] );
        }

        $id_requisicao = ( int ) $_POST ['id_requisicao_procedimento'];

        if (!( int ) $_POST ['id_medico']) {
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'Informe o id do médico.'
                ] );
        }
        $idMedico = ( int ) $_POST ['id_medico'];

        $sqlDadosPaciente = <<<SQL
		    SELECT 
		        requisicao_procedimento.id as id_requisicao_procedimento,
		        requisicao_procedimento.id_pet as id_pet,
		        requisicao_procedimento.id_convenio_procedimento as id_convenio_procedimento,
		        requisicao_procedimento.id_medico as id_medico,
		        convenio_procedimento.id_procedimento as id_procedimento,
		        procedimento.id_tipo_procedimento as id_tipo_procedimento
		        from requisicao_procedimento 
		        inner join convenio_procedimento on requisicao_procedimento.id_convenio_procedimento = convenio_procedimento.id
		        inner join procedimento on procedimento.id = convenio_procedimento.id_procedimento 
		    WHERE 
		        requisicao_procedimento.id = :id_requisicao_procedimento:
		    limit 1
		SQL;

        $binds = [
            'id_requisicao_procedimento' => $id_requisicao
        ];

        $conn = db_connect();
        $query = $conn->query( $sqlDadosPaciente, $binds )
            ->getResultArray();
        if (count( $query )) {
            $query = $query [0];
        } else {
            return $this->response->setStatusCode( 419 )
                ->setJSON( [
                    'message' => 'Essa requisicao de procedimento não existe.'
                ] );
        }

        if ($query ['id_medico'] != null and $query ['id_medico'] != $idMedico) {
            return $this->response->setStatusCode( 405 )
                ->setJSON( [
                    'message' => 'Essa requisicao já foi iniciada por outro médico.'
                ] );
        }

        if ($query ['id_medico'] != null and $query ['id_medico'] == $idMedico) {
            return $this->response->setStatusCode( 204 )
                ->setJSON( [
                    'message' => 'Essa consulta já foi iniciada por você, acesse a sala.'
                ] );
        }

        $bodyRequest = [
            'petId' => ( int ) $query ['id_pet'],
            'id_requisicao_procedimento' => ( int ) $_POST ['id_requisicao_procedimento'],
            'unidadeId' => 24,
            'medicoId' => ( int ) $_POST ['id_medico'],
            'tipoProcedimentoId' => ( int ) $query ['id_tipo_procedimento'],
            'procedimentoId' => ( int ) $query ['id_procedimento']
        ];

        if (!$bodyRequest ['petId']) {
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'message' => 'Informe o pet.'
                ] );
        }
        if (!$bodyRequest ['unidadeId']) {
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'message' => 'Informe a unidade.'
                ] );
        }
        if (!$bodyRequest ['medicoId']) {
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'message' => 'Informe o médico.'
                ] );
        }

        if (!$bodyRequest ['tipoProcedimentoId']) {
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'Informe o tipo de procedimento.'
                ] );
        }
        if (!$bodyRequest ['procedimentoId']) {
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'Informe o procedimento.'
                ] );
        }

        $sql_agd_esp = <<<SQL
			select id_agenda_especialidade
			from agendamento_especialidade aep
			where aep.id_requisicao_procedimento  = :id_requisicao_procedimento:
		SQL;

        $bind_agd_esp = [
            'id_requisicao_procedimento' => ( int ) $_POST ['id_requisicao_procedimento']
        ];

        $conn_agd_esp = db_connect();
        $result_agd_esp = $conn_agd_esp->query( $sql_agd_esp, $bind_agd_esp )
            ->getResultArray();
        $errors_agd_esp = $conn_agd_esp->error();

        if ($errors_agd_esp ['code'] != 0) {
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'message' => 'Agendamento não encontrado para a requisição informada.'
                ] );
        }

        if (count( $result_agd_esp ) < 1) {
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'message' => 'Agendamento não encontrado para a requisição informada.'
                ] );
        }

        $idAgendaEspecialidade = $result_agd_esp [0] ['id_agenda_especialidade'];

        $update_medico_agd_esp = <<<SQL
			update agenda_especialidade
			set id_medico = :id_medico:
			where id = :id_agenda_especialidade: and id_medico is null
		SQL;

        $bind_upd_medico_agd_esp = [
            'id_medico' => $idMedico,
            'id_agenda_especialidade' => $idAgendaEspecialidade
        ];

        $conn_upd_medico_agd_esp = db_connect();
        $conn_upd_medico_agd_esp->query( $update_medico_agd_esp, $bind_upd_medico_agd_esp )->numRows;
        $errors_upd_medico_agd_esp = $conn_upd_medico_agd_esp->error();

        if ($errors_upd_medico_agd_esp ['code'] != 0) {
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'message' => 'Não foi possivel iniciar esse atendimento.'
                ] );
        }
        $update_medico_affectrow = $conn_upd_medico_agd_esp->affectedRows();

        if ($update_medico_affectrow == 0) {
            return $this->response->setStatusCode( 405 )
                ->setJSON( [
                    'message' => 'Agendamento já em atendimento por outro médico.'
                ] );
        }

        $sqlDadosPaciente = <<<SQL
		    SELECT 
		        p.id as pet_id,
		        c.id as cliente_id,
		        pac.id as paciente_id
		    from pet p
		    inner join pet_cliente pc on pc.id_pet = p.id 
		    inner join cliente c on c.id = pc.id_cliente 
		    inner join pessoa pes on pes.id = c.id_pessoa 
		    inner join paciente pac on pac.id_pessoa = pes.id 
		    WHERE 
		        p.id = :pet_id:
		    limit 1
		SQL;

        $binds = [
            'pet_id' => $bodyRequest ['petId']
        ];

        $query = $conn->query( $sqlDadosPaciente, $binds )
            ->getResultArray();
        if (count( $query )) {
            $query = $query [0];
        } else {
            die( 'Esse pet não existe.' );
        }
        $bodyRequest ['pacienteId'] = ( int ) $query ['paciente_id'];
        $bodyRequest ['clienteId'] = ( int ) $query ['cliente_id'];
        $sqlProximaAgendaLivre = <<<SQL
		    select a.id as agenda_id from agenda a 
		    left join agendamento ag on ag.id_agenda = a.id
		    where 1=1 
		        and a.id_medico = :medico_id:
		        and ag.id is null
		        and left(now(),10) =  a.`data` 
		    limit 1
		SQL;

        $agendaLivreQuery = $conn->query( $sqlProximaAgendaLivre, [
            'medico_id' => $bodyRequest ['medicoId']
        ] )
            ->getResultArray();
        if (count( $agendaLivreQuery ) > 0) {
            $agendaId = ( int ) $agendaLivreQuery [0] ['agenda_id'];
        } else {
            $sqlInsertAgenda = <<<SQL
			    insert into agenda (codigo,id_medico,data,hora_inicio, hora_final, id_tipo_procedimento, adicionado_por, alterado_por, criado_em,alterado_em,id_unidade, id_assistente)
			    values (
			        :codigo:,
			        :id_medico:,
			        :data:,
			        :hora_inicio:,
			        :hora_final:,
			        :id_tipo_procedimento:,
			        :adicionado_por:,
			        :alterado_por:,
			        :criado_em:,
			        :alterado_em:,
			        :id_unidade:, 
			        :id_assistente:	
			    )
			SQL;
            $currdate = date( 'Y-m-d' );
            $bindsInsertAgenda = [
                'codigo' => $bodyRequest ['medicoId'] . '-' . $bodyRequest ['unidadeId'] . '-' . date( 'Ymd' ) . '00000000' . date( 'Ymdhis' ),
                'id_medico' => $bodyRequest ['medicoId'],
                'data' => $currdate,
                'hora_inicio' => date( 'H:i:s' ),
                'hora_final' => date( 'H:i:s' ),
                'id_tipo_procedimento' => $bodyRequest ['tipoProcedimentoId'],
                'adicionado_por' => UsuarioLogado::getUsuarioId(),
                'alterado_por' => null,
                'criado_em' => date( 'Y-m-d H:i:s' ),
                'alterado_em' => null,
                'id_unidade' => $bodyRequest ['unidadeId'],
                'id_assistente' => null
            ];
            $conn->query( $sqlInsertAgenda, $bindsInsertAgenda );
            $agendaId = $conn->insertID();
        }

        $agendamentoCriacaoSql = <<<SQL
			insert into agendamento 
				(id_agenda, id_cliente, id_paciente, id_procedimento, id_requisicao,  
				codigo, cancelado_em, adicionado_por, alterado_por, alterado_em, criado_em, atrasado)
			values 
				( :id_agenda:, :id_cliente:, :id_paciente:, :id_procedimento:, :id_requisicao:,
				:codigo:, :cancelado_em:, :adicionado_por:, :alterado_por:, :alterado_em:,
				:criado_em:,:atrasado:)
		SQL;

        $binds = [
            'id_agenda' => $agendaId,
            'id_cliente' => $bodyRequest ['clienteId'],
            'id_paciente' => $bodyRequest ['pacienteId'],
            'id_procedimento' => $bodyRequest ['procedimentoId'],
            'id_requisicao' => $id_requisicao,
            'codigo' => $agendaId . '_' . date( 'Ymd' ) . ' ' . '00:00:00',
            'cancelado_em' => null,
            'adicionado_por' => UsuarioLogado::getUsuarioId(),
            'alterado_por' => null,
            'alterado_em' => null,
            'criado_em' => date( 'Y-m-d H:i:s' ),
            'atrasado' => 0
        ];

        $sqlAgendamentoPet = <<<SQL
		    insert into agendamento_pet (id_agendamento, id_pet)
		    values (:id_agendamento:, :id_pet:)
		SQL;

        $sqlVinculaMedico = <<<SQL
		    update requisicao_procedimento set id_medico = :id_medico:
		    where id = :id_requisicao_procedimento:
		SQL;

        $conn = db_connect();
        $conn->transBegin();
        $conn->query( $agendamentoCriacaoSql, $binds );
        $agendamentoId = $conn->insertID();

        $conn->query( $sqlAgendamentoPet, [
            'id_agendamento' => $agendamentoId,
            'id_pet' => $bodyRequest ['petId']
        ] );

        $conn->query( $sqlVinculaMedico,
            [
                'id_medico' => $bodyRequest ['medicoId'],
                'id_requisicao_procedimento' => $bodyRequest ['id_requisicao_procedimento']
            ] );
        if ($agendamentoId) {
            $conn->transCommit();
        }
        return $this->response->setStatusCode( 200 )
            ->setJSON( [
                'message' => 'O paciente foi agendado com sucesso..',
                'data' => $agendamentoId
            ] );

    }















}
