<?php

namespace app\DAO;

use App\DAO\DAO;
use App\DAO\DAOResponse\DAOResponse;
use app\ViewModels\ChameFacil\ChameFacilSenhaResgistrationViewModel\ChameFacilSenhaRegistrationViewModel;
use Exception;
use App\DAO\DAOResponse\DAOResponseInterface;

class ChameFacilDAO extends DAO {

	public function registerSenhaChamar(ChameFacilSenhaRegistrationViewModel $cf_request): DAOResponse {
		
		$dao_response = new DAOResponse();
		try {
			$conn = db_connect();
			$sql = <<<SQL
				insert into chamefacil_senhas
					(criado_por,data_criacao,hora_criacao,operacao,setor) values
					(:usuario_id:,:data_cr:,:hora_cr:,:op:,:set:)
			SQL;
			$binds = [										
					'usuario_id' => $cf_request->getCriadoPor(),
					'data_cr' => $cf_request->getDataCriacao(),
					'hora_cr' => $cf_request->getHoraCriacao(),
					'op' => $cf_request->getOperacao(),
					'set' => $cf_request->getSetor()
			];
			$binds ['fila_interna_id'] = $cf_request->getIdFilaInterna() == 0 ? NULL : $cf_request->getIdFilaInterna();
			$binds ['requisicao_id'] = $cf_request->getIdRequisicao() == 0 ? NULL : $cf_request->getIdRequisicao();
			$binds ['procedimento_id'] = $cf_request->getIdProcedimento() == 0 ? NULL : $cf_request->getIdProcedimento();
			$binds ['tipo_convenio_id'] = $cf_request->getIdTipoConvenio() == 0 ? NULL : $cf_request->getIdTipoConvenio();
			
			$conn->query( $sql, $binds );
			$errors = $conn->error();
			
			if ($errors ['code'] != 0) {
				$dao_response->setErrors( $errors );
				$dao_response->setStatus( DAOResponseInterface::DATABASE_CONNECTION_ERROR );
			} else {
				$newId = $conn->insertID();
				$dao_response->setStatus( DAOResponseInterface::SUCESS );
				$dao_response->setData( [
						'Id' => $newId
				] );
			}
		} catch ( Exception $e ) {
			$dao_response->setErrors( $e );
			$dao_response->setStatus( DAOResponseInterface::UNKNOWN_ERROR );
		}
		
		return $dao_response;
		
	}
	public function registerRecepcaoSenha(ChameFacilSenhaRegistrationViewModel $cf_request): DAOResponse {

		$dao_response = new DAOResponse();
		try {
			$conn = db_connect();
			$sql = <<<SQL
				insert into chamefacil_senhas
					(id_senha,id_fila_interna,id_requisicao,id_tutor,id_pet,id_procedimento,
					id_unidade,id_tipo_convenio,criado_por,data_criacao,hora_criacao,operacao,setor) values
					(:senha_id:,:fila_interna_id:, :requisicao_id:, :tutor_id:, :pet_id:, :procedimento_id:,
					:unidade_id:,:tipo_convenio_id:,:usuario_id:,:data_cr:,:hora_cr:,:op:,:set:)
			SQL;
			$binds = [ 
				'senha_id' => $cf_request->getIdSenha(),
				'tutor_id' => $cf_request->getIdTutor(),
				'pet_id' => $cf_request->getIdPet(),
				'unidade_id' => $cf_request->getIdUnidade(),

				'usuario_id' => $cf_request->getCriadoPor(),
				'data_cr' => $cf_request->getDataCriacao(),
				'hora_cr' => $cf_request->getHoraCriacao(),
				'op' => $cf_request->getOperacao(),
				'set' => $cf_request->getSetor()
			];
			$binds ['fila_interna_id'] = $cf_request->getIdFilaInterna() == 0 ? NULL : $cf_request->getIdFilaInterna();
			$binds ['requisicao_id'] = $cf_request->getIdRequisicao() == 0 ? NULL : $cf_request->getIdRequisicao();
			$binds ['procedimento_id'] = $cf_request->getIdProcedimento() == 0 ? NULL : $cf_request->getIdProcedimento();
			$binds ['tipo_convenio_id'] = $cf_request->getIdTipoConvenio() == 0 ? NULL : $cf_request->getIdTipoConvenio();

			$conn->query( $sql, $binds );
			$errors = $conn->error();

			if ($errors ['code'] != 0) {
				$dao_response->setErrors( $errors );
				$dao_response->setStatus( DAOResponseInterface::DATABASE_CONNECTION_ERROR );
			} else {
				$newId = $conn->insertID();
				$dao_response->setStatus( DAOResponseInterface::SUCESS );
				$dao_response->setData( [ 
					'Id' => $newId
				] );
			}
		} catch ( Exception $e ) {
			$dao_response->setErrors( $e );
			$dao_response->setStatus( DAOResponseInterface::UNKNOWN_ERROR );
		}

		return $dao_response;

	}

	public function getRecepcaoSenha(int $id_senha, int $id_pet, int $id_unidade): DAOResponse {

		$dao_response = new DAOResponse();
		try {
			$conn = db_connect();
			$sql = <<<SQL
				select id , id_senha,id_fila_interna,id_requisicao,id_tutor,id_pet,id_procedimento,
					id_unidade,id_tipo_convenio,criado_por,data_criacao,hora_criacao,operacao,setor
					from  chamefacil_senhas
				where id_senha = :senha_id:
					and id_pet = :pet_id:
					and id_unidade = :unidade_id:					
					and operacao = 'Aguardar'
					order by id desc
					limit 1
			SQL;
			$binds = [ 
				'senha_id' => $id_senha,
				'pet_id' => $id_pet,
				'unidade_id' => $id_unidade
			];

			$result = $conn->query( $sql, $binds )
				->getResultArray();
			$errors = $conn->error();

			if ($errors ['code'] != 0) {
				$dao_response->setErrors( $errors );
				$dao_response->setStatus( DAOResponseInterface::DATABASE_CONNECTION_ERROR );
			} else {
				$dao_response->setStatus( DAOResponseInterface::SUCESS );
				$dao_response->setData( $result [0] );
			}
		} catch ( Exception $e ) {
			$dao_response->setErrors( $e );
			$dao_response->setStatus( DAOResponseInterface::UNKNOWN_ERROR );
		}

		return $dao_response;

	}

	public function getMedicoSenha(int $id_senha, int $id_pet, int $id_unidade, int $id_filainterna): DAOResponse {

		$dao_response = new DAOResponse();
		try {
			$conn = db_connect();
			$sql = <<<SQL
				select id , id_senha,id_fila_interna,id_requisicao,id_tutor,id_pet,id_procedimento,
					id_unidade,id_tipo_convenio,criado_por,data_criacao,hora_criacao,operacao,setor
					from  chamefacil_senhas
				where id_senha = :senha_id: 
					and id_pet = :pet_id:
					and id_unidade = :unidade_id:
					and id_fila_interna = :fila_interna_id:
					and operacao = 'Encaminhar'
					order by id desc
					limit 1
			SQL;
			$binds = [ 
				'senha_id' => $id_senha,
				'pet_id' => $id_pet,
				'unidade_id' => $id_unidade,
				'fila_interna_id' => $id_filainterna
			];

			$result = $conn->query( $sql, $binds )
				->getResultArray();
			$errors = $conn->error();

			if ($errors ['code'] != 0) {
				$dao_response->setErrors( $errors );
				$dao_response->setStatus( DAOResponseInterface::DATABASE_CONNECTION_ERROR );
			} else {
				$dao_response->setStatus( DAOResponseInterface::SUCESS );
				$dao_response->setData( $result [0] );
			}
		} catch ( Exception $e ) {
			$dao_response->setErrors( $e );
			$dao_response->setStatus( DAOResponseInterface::UNKNOWN_ERROR );
		}

		return $dao_response;

	}

}

