<?php

namespace App\Mappers;

use App\DAO\ConsultaDAO;
use App\Entities\Consulta\Consulta;
use App\Entities\Prontuario\Prontuario;
use App\Entities\RespostaEscolhaOpcao\RespostaEscolhaOpcao;
use App\Entities\RespostaFormulario\RespostaFormulario;
use App\Entities\RespostaNumericaDecimal\RespostaNumericaDecimal;
use App\Entities\RespostaNumericaInteira\RespostaNumericaInteira;
use App\Entities\RespostaTextual\RespostaTextual;
use App\Models\RespostaNumericaDecimalModel;
use App\Utils\Collections\GeneralCollection;
use App\ViewModels\Consulta\ConsultaByMedicoViewModel\ConsultaByMedicoViewModel;
use App\ViewModels\Consulta\ConsultaDetailsViewModel\ConsultaDetailsResponseDatabase;
use App\ViewModels\Consulta\ConsultaDetailsViewModel\ConsultaDetailsViewModel;
use App\ViewModels\Consulta\ConsultaDetailsViewModel\OpcaoDetailsConsulta;
use App\ViewModels\Consulta\ConsultaDetailsViewModel\OpcaoDetailsConsultaCollection;
use App\ViewModels\Consulta\ConsultaDetailsViewModel\PerguntaDetailsConsulta;
use App\ViewModels\Consulta\ConsultaDetailsViewModel\PerguntaDetailsConsultaCollection;
use App\ViewModels\Consulta\ConsultaListingViewModel\ConsultaListingViewModel;
use App\ViewModels\Consulta\ConsultaRegistrationViewModel\ConsultaRegistrationViewModel;
use App\ViewModels\Consulta\ConsultaRegistrationViewModel\RespostaFormularioAbstract;
use App\ViewModels\Consulta\ConsultaRegistrationViewModel\RespostaFormularioCollection;
use App\ViewModels\Consulta\ConsultaRegistrationViewModel\RespostaNumericaDecimal as RespostaNumericaDecimalVM;
use App\ViewModels\Consulta\ConsultaRegistrationViewModel\RespostaNumericaInteira as RespostaNumericaInteiraVM;
use App\ViewModels\Consulta\ConsultaRegistrationViewModel\RespostaTextual as RespostaTextualVM;
use App\ViewModels\Consulta\ConsultaRegistrationViewModel\RespostaEscolhaOpcao as RespostaEscolhaOpcaoVM;
use App\ViewModels\Consulta\ConsultaUpdateViewModel\ConsultaUpdateViewModel;
use App\ViewModels\Consulta\ConsultaUpdateViewModel\RespostaFormularioUpdateCollection;
use App\ViewModels\Consulta\ConsultaUpdateViewModel\RespostaNumericaDecimal as RespostaNumericaDecimalVMUpdate;
use App\ViewModels\Consulta\ConsultaUpdateViewModel\RespostaNumericaInteira as RespostaNumericaInteiraVMUpdate;
use App\ViewModels\Consulta\ConsultaUpdateViewModel\RespostaTextual as RespostaTextualVMUpdate;
use App\ViewModels\Consulta\ConsultaUpdateViewModel\RespostaEscolhaOpcao as RespostaEscolhaOpcaoVMUpdate;
use App\Services\JWT\UsuarioLogado;
use App\Services\MedicoService;

class ConsultaMapper {

	public static function getConsultaRegistrationVMFromArray(array $data_post): ConsultaRegistrationViewModel {

		$id_agendamento = ( int ) $data_post ['id_agendamento'];
		$titulo = $data_post ['titulo'];
		$descricao = $data_post ['descricao'];
		$id_formulario = $data_post ['id_formulario'];
		$resposta_numerica_inteira_collection = new RespostaFormularioCollection();
		$resposta_numerica_decimal_collection = new RespostaFormularioCollection();
		$resposta_textual_collection = new RespostaFormularioCollection();
		$resposta_escolha_opcao_collection = new RespostaFormularioCollection();
		foreach ( $data_post ['respostas'] as $resposta ) {
			switch (gettype( $resposta ['resposta'] )) {
				case 'integer' :
					$resposta_numerica_inteira_collection->push( 
						RespostaNumericaInteiraVM::builder()->setResposta( ( int ) $resposta ['resposta'] )
							->setIdPergunta( ( int ) $resposta ['id_pergunta'] )
							->build() );
					break;
				case 'double' :
					$resposta_numerica_decimal_collection->push( 
						RespostaNumericaDecimalVM::builder()->setResposta( ( float ) $resposta ['resposta'] )
							->setIdPergunta( ( int ) $resposta ['id_pergunta'] )
							->build() );
					break;
				case 'string' :
					$resposta_textual_collection->push( 
						RespostaTextualVM::builder()->setResposta( ( string ) $resposta ['resposta'] )
							->setIdPergunta( ( int ) $resposta ['id_pergunta'] )
							->build() );
					break;
				case 'array' :
					$resposta_escolha_opcao_collection->push( 
						RespostaEscolhaOpcaoVM::builder()->setResposta( new GeneralCollection( $resposta ['resposta'] ) )
							->setIdPergunta( ( int ) $resposta ['id_pergunta'] )
							->build() );
					break;
			}
		}
		$consulta_registration_vm = ConsultaRegistrationViewModel::builder()->setDescricao( $descricao )
			->setTitulo( $titulo )
			->setIdAgendamento( $id_agendamento )
			->setIdFormulario( $id_formulario )
			->setRespostaEscolhaOpcaoCollection( $resposta_escolha_opcao_collection )
			->setRespostaNumericaDecimalCollection( $resposta_numerica_decimal_collection )
			->setRespostaTextualCollection( $resposta_textual_collection )
			->setRespostaNumericaInteiraCollection( $resposta_numerica_inteira_collection )
			->build();
		return $consulta_registration_vm;

	}

	public static function getConsultaAnamneseAdicionalRegistrationVMFromArray(array $data_post): ConsultaRegistrationViewModel {

		$id_agendamento = ( int ) $data_post ['id_agendamento'];
		$titulo = $data_post ['titulo'];
		$descricao = $data_post ['descricao'];
		$id_formulario = $data_post ['id_formulario'];
		$resposta_numerica_inteira_collection = new RespostaFormularioCollection();
		$resposta_numerica_decimal_collection = new RespostaFormularioCollection();
		$resposta_textual_collection = new RespostaFormularioCollection();
		$resposta_escolha_opcao_collection = new RespostaFormularioCollection();
		$data = $data_post ['respostas'];
		$resp = $data->getData();
		$respostas = $resp ['respostas'];
		foreach ( $respostas as $resposta ) {
			switch (gettype( $resposta ['resposta'] )) {
				case 'integer' :
					$resposta_numerica_inteira_collection->push( 
						RespostaNumericaInteiraVM::builder()->setResposta( ( int ) $resposta ['resposta'] )
							->setIdPergunta( ( int ) $resposta ['id_pergunta'] )
							->build() );
					break;
				case 'double' :
					$resposta_numerica_decimal_collection->push( 
						RespostaNumericaDecimalVM::builder()->setResposta( ( float ) $resposta ['resposta'] )
							->setIdPergunta( ( int ) $resposta ['id_pergunta'] )
							->build() );
					break;
				case 'string' :
					$resposta_textual_collection->push( 
						RespostaTextualVM::builder()->setResposta( ( string ) $resposta ['resposta'] )
							->setIdPergunta( ( int ) $resposta ['id_pergunta'] )
							->build() );
					break;
				case 'array' :
					$resposta_escolha_opcao_collection->push( 
						RespostaEscolhaOpcaoVM::builder()->setResposta( new GeneralCollection( $resposta ['resposta'] ) )
							->setIdPergunta( ( int ) $resposta ['id_pergunta'] )
							->build() );
					break;
			}
		}
		$consulta_registration_vm = ConsultaRegistrationViewModel::builder()->setDescricao( $descricao )
			->setTitulo( $titulo )
			->setIdAgendamento( $id_agendamento )
			->setIdFormulario( $id_formulario )
			->setRespostaEscolhaOpcaoCollection( $resposta_escolha_opcao_collection )
			->setRespostaNumericaDecimalCollection( $resposta_numerica_decimal_collection )
			->setRespostaTextualCollection( $resposta_textual_collection )
			->setRespostaNumericaInteiraCollection( $resposta_numerica_inteira_collection )
			->build();
		return $consulta_registration_vm;

	}

	public static function getConsultaByConsultaRegistrationVM(ConsultaRegistrationViewModel $consulta_registration_vm): Consulta {

		$usr = UsuarioLogado::getUsuarioId();
		return Consulta::builder()->setTitulo( $consulta_registration_vm->getTitulo() )
			->setDescricao( $consulta_registration_vm->getDescricao() )
			->setIdAgendamento( $consulta_registration_vm->getIdAgendamento() )
			->setIdFormulario( $consulta_registration_vm->getIdFormulario() )
			->setAdicionadoPor( $usr )
			->build();

	}

	public static function getProntuarioByConsultaRegistrationVM(ConsultaRegistrationViewModel $consulta_registration_vm, $id_paciente): Prontuario {
		
		$usr = UsuarioLogado::getUsuarioId();
		$medicoService = new MedicoService();
		$id_medico = $medicoService->getMedicoIDFromUsuarioID($usr);
		if($id_medico == 0) {
			$id_medico = null;
		}
		return Prontuario::builder()->setIdMedico($id_medico )
			->setIdPaciente( $id_paciente )
			->build();

	}

	public static function getRespostaFormularioCollection(RespostaFormularioCollection $resposta_formulario_collection, Consulta $consulta): GeneralCollection {

		return $resposta_formulario_collection->map( 
			function (RespostaFormularioAbstract $resposta_formulario) use ($consulta): RespostaFormulario {
				return RespostaFormulario::builder()->setIdPERGUNTA( $resposta_formulario->getIdPergunta() )
					->setIdCONSULTA( $consulta->getId() )
					->build();
			} );

	}

	# ---------------------------------------------------------------------------------------------------------------#
	public static function getFormularioListingVMCollectionFromArray(array $result_array): GeneralCollection {

		$consulta_vm_collection = new GeneralCollection();
		foreach ( $result_array as $row ) {
			$consulta_vm_collection->push( self::getConsultaListingVMFromArray( $row ) );
		}
		return $consulta_vm_collection;

	}

	public static function getConsultaListingVMFromArray(array $consulta): ConsultaListingViewModel {

		$status_desc = 'Cancelado';
// 		if (($consulta ['status'] == '0000-00-00 00:00:00') || ($consulta ['status'] == '1900-01-01 00:00:00')) {
// 			$status_desc = 'Agendado';
// 		}
		if ($consulta ['status'] == '0000-00-00 00:00:00') {
			$status_desc = 'Agendado';
		}
		if ($consulta ['status'] == '1900-01-01 00:00:00') {
			$status_desc = 'Atendido';
		}

		return ConsultaListingViewModel::builder()->setIdAgendamento( $consulta ['id_agendamento'] )
			->setIdConsulta( $consulta ['id_consulta'] )
			->setIdProcedimento( $consulta ['id_procedimento'] )
			->setIdAgenda( $consulta ['id_agenda'] ?? 0)
			->setIdUnidade( $consulta ['id_unidade'] ?? 0)
			->setProcedimento( $consulta ['procedimento'] )
			->setIdRequisicao( $consulta ['id_requisicao'] )
			->setReqst( $consulta ['req_st'] )
			->setTipoAnamnese( $consulta ['tipo_anamnese'] )
			->setData( $consulta ['data'] )
			->setHoraInicio( $consulta ['hora_inicio'] )
			->setHoraFim( $consulta ['hora_fim'] )
			->setConsultaTitulo( $consulta ['consulta_titulo'] )
			->setConsultaDescricao( $consulta ['consulta_descricao'] )
			->setIdPet( $consulta ['id_pet'] )
			->setNomePet( $consulta ['nome_pet'] )
			->setIdRaca( $consulta ['id_raca'] )
			->setNomeRaca( $consulta ['nome_raca'] )
			->setUnidadeDescricao( $consulta ['unidade_descricao'] )
			->setIdMedico( $consulta ['id_medico'] )
			->setIdAssistente( $consulta ['id_assistente'] )
			->setNomeMedico( $consulta ['nome_medico'] ?? '')
			->setNomeAssistente( $consulta ['nome_assistente'] ?? '')
			->setStatus( $status_desc )
			->build();

	}



    public static function getFormularioListingTelevetVMCollectionFromArray(array $result_array): GeneralCollection {

        $consulta_vm_collection = new GeneralCollection();
        foreach ( $result_array as $row ) {
            $consulta_vm_collection->push( self::getConsultaListingTelevetVMFromArray( $row ) );
        }
        return $consulta_vm_collection;

    }

    public static function getConsultaListingTelevetVMFromArray(array $consulta): ConsultaListingViewModel {

        $status_desc = 'Cancelado';
// 		if (($consulta ['status'] == '0000-00-00 00:00:00') || ($consulta ['status'] == '1900-01-01 00:00:00')) {
// 			$status_desc = 'Agendado';
// 		}
        if ($consulta ['status'] == '0000-00-00 00:00:00') {
            $status_desc = 'Agendado';
        }
        if ($consulta ['status'] == '1900-01-01 00:00:00') {
            $status_desc = 'Atendido';
        }

        $frases = array(
            0 => "Pendente.",
            1 => "Sala Aberta.",
            2 => "Concluido.",
            3 => "Não Compareceu.",
            4 => "Desistência.",
            5 => "Tutor perdeu a conexão.",
            6 => "Instabilidade de conexão."
        );

        return ConsultaListingViewModel::builder()->setIdAgendamento( $consulta ['id_agendamento'] )
            ->setIdConsulta( $consulta ['id_consulta'] )
            ->setIdProcedimento( $consulta ['id_procedimento'] )
            ->setIdAgenda( $consulta ['id_agenda'] ?? 0)
            ->setIdUnidade( $consulta ['id_unidade'] ?? 0)
            ->setProcedimento( $consulta ['procedimento'] )
            ->setIdRequisicao( $consulta ['id_requisicao'] )
            ->setReqst( $consulta ['req_st'] )
            ->setTipoAnamnese( $consulta ['tipo_anamnese'] )
            ->setData( $consulta ['data'] )
            ->setHoraInicio( $consulta ['hora_inicio'] )
            ->setHoraFim( $consulta ['hora_fim'] )
            ->setConsultaTitulo( $consulta ['consulta_titulo'] )
            ->setConsultaDescricao( $consulta ['consulta_descricao'] )
            ->setIdPet( $consulta ['id_pet'] )
            ->setNomePet( $consulta ['nome_pet'] )
            ->setIdRaca( $consulta ['id_raca'] )
            ->setNomeRaca( $consulta ['nome_raca'] )
            ->setUnidadeDescricao( $consulta ['unidade_descricao'] )
            ->setIdMedico( $consulta ['id_medico'] )
            ->setIdAssistente( $consulta ['id_assistente'] )
            ->setNomeMedico( $consulta ['nome_medico'] ?? '')
            ->setNomeAssistente( $consulta ['nome_assistente'] ?? '')
            ->setStatus( $status_desc )
            ->setStatusSala( $consulta['status_sala'] != NULL ? $frases[$consulta['status_sala']] : NULL )
            ->build();

    }



	public static function getConsultaListingArrayFromVM(GeneralCollection $consulta_listing_vm): array {

		return $consulta_listing_vm->toArray();

	}

	# ---------------------------------------------------------------------------------------------------------------#
	public static function getConsultaUpdateVMFromArray(array $data_post): ConsultaUpdateViewModel {

		$id_agendamento = ( int ) $data_post ['id_agendamento'];
		$titulo = $data_post ['titulo'];
		$descricao = $data_post ['descricao'];
		$respostas = $data_post ['respostas'];

		// $resposta_numerica_inteira_collection = new RespostaFormularioUpdateCollection();
		// $resposta_numerica_decimal_collection = new RespostaFormularioUpdateCollection();
		// $resposta_textual_collection = new RespostaFormularioUpdateCollection();
		// $resposta_escolha_opcao_collection = new RespostaFormularioUpdateCollection();
		// foreach ($data_post['respostas'] as $resposta) {
		// switch (gettype($resposta['resposta'])) {
		// case 'integer':
		// $resposta_numerica_inteira_collection->push(RespostaNumericaInteiraVMUpdate::builder()
		// ->setResposta((int)$resposta['resposta'])
		// ->setIdPergunta((int)$resposta['id_pergunta'])
		// ->build()
		// );
		// break;
		// case 'double':
		// $resposta_numerica_decimal_collection->push(RespostaNumericaDecimalVMUpdate::builder()
		// ->setResposta((float)$resposta['resposta'])
		// ->setIdPergunta((int)$resposta['id_pergunta'])
		// ->build()
		// );
		// break;
		// case 'string':
		// $resposta_textual_collection->push(RespostaTextualVMUpdate::builder()
		// ->setResposta((string)$resposta['resposta'])
		// ->setIdPergunta((int)$resposta['id_pergunta'])
		// ->build()
		// );
		// break;
		// case 'array':
		// $resposta_escolha_opcao_collection->push(RespostaEscolhaOpcaoVMUpdate::builder()
		// ->setResposta(new GeneralCollection($resposta['resposta']))
		// ->setIdPergunta((int)$resposta['id_pergunta'])
		// ->build()
		// );
		// break;
		// }
		// }
		$consulta_registration_vm = ConsultaUpdateViewModel::builder()->setDescricao( $descricao )
			->setTitulo( $titulo )
			->setIdAgendamento( $id_agendamento )
			->setRespostas( $respostas )
			->
		// ->setRespostaEscolhaOpcaoCollection($resposta_escolha_opcao_collection)
		// ->setRespostaNumericaDecimalCollection($resposta_numerica_decimal_collection)
		// ->setRespostaTextualCollection($resposta_textual_collection)
		// ->setRespostaNumericaInteiraCollection($resposta_numerica_inteira_collection)
		build();
		return $consulta_registration_vm;

	}

	public static function getConsultaByConsultaUpdateVM(ConsultaUpdateViewModel $consulta_update_vm): Consulta {

		return Consulta::builder()->setTitulo( $consulta_update_vm->getTitulo() )
			->setDescricao( $consulta_update_vm->getDescricao() )
			->setIdAGENDAMENTO( $consulta_update_vm->getIdAgendamento() )
			->build();

	}

	public static function getRespostaNumericaByConsultaUpdateVM(array $consulta_update_vm, int $resposta_formulario_id): RespostaNumericaDecimal {

		return RespostaNumericaDecimal::builder()->setIdRESPOSTAFORMULARIO( $resposta_formulario_id )
			->setResposta( $consulta_update_vm ['resposta'] )
			->build();

	}

	public static function getRespostaInteiraByConsultaUpdateVM(array $consulta_update_vm, int $resposta_formulario_id): RespostaNumericaInteira {

		return RespostaNumericaInteira::builder()->setIdRESPOSTAFORMULARIO( $resposta_formulario_id )
			->setResposta( $consulta_update_vm ['resposta'] )
			->build();

	}

	public static function getRespostaTextualByConsultaUpdateVM(array $consulta_update_vm, int $resposta_formulario_id): RespostaTextual {

		return RespostaTextual::builder()->setIdRESPOSTAFORMULARIO( $resposta_formulario_id )
			->setResposta( $consulta_update_vm ['resposta'] )
			->build();

	}

	public static function getRespostaOptionByConsultaUpdateVM(array $consulta_update_vm, int $resposta_formulario_id): RespostaEscolhaOpcao {

		return RespostaEscolhaOpcao::builder()->setIdRESPOSTAFORMULARIO( $resposta_formulario_id )
			->setIdOPCAOPERGUNTA( $consulta_update_vm ['resposta'] )
			->build();

	}

	# -----------------------------------------------------------------------------------------------------------------------#
	public static function getConsultaDetailsVMFromArray(array $response_array, int $id_consulta): ConsultaDetailsViewModel {

		$formulario_details_vm = new ConsultaDetailsViewModel();
		$formulario_id = null;
		if (isset( $response_array [0] ['formulario_id'] )) {
			$formulario_id = $response_array [0] ['formulario_id'];
		}
		$formulario_details_response_db_collection = (new GeneralCollection( $response_array ))->map( 
			function (array $row): ConsultaDetailsResponseDatabase {
				return ConsultaDetailsResponseDatabase::builder()->setConsultaId( $row ['consulta_id'] )
					->setConsultaTitulo( $row ['titulo_consulta'] )
					->setConsultaDescricao( $row ['descricao_consulta'] )
					->setIdAgendamento( $row ['id_agendamento'] )
					->setFormularioTitulo( $row ['formulario_titulo'] )
					->setFormularioAtivo( $row ['formulario_ativo'] )
					->setFormularioDescricao( $row ['formulario_descricao'] )
					->setFormularioIdMedico( $row ['formulario_id_medico'] ?? 0)
					->setPerguntaId( $row ['pergunta_id'] )
					->setPergunta_ativo( $row ['pergunta_ativo'] )
					->setPergunta_ordem( $row ['pergunta_ordem'] )
					->setPerguntaTextoPergunta( $row ['pergunta_texto_pergunta'] )
					->setPerguntaIdTipoPergunta( $row ['pergunta_id_tipo_pergunta'] )
					->setPerguntaObrigatorio( $row ['pergunta_obrigatorio'] )
					->setOpcaoPerguntaId( $row ['opcao_pergunta_id'] )
					->setOpcaoPerguntaDescricao( $row ['opcao_pergunta_descricao'] )
					->setOpcaoPerguntaIdPergunta( $row ['opcao_pergunta_id_pergunta'] )
					->setRespostaPerguntaTextual( $row ['resposta_pergunta_textual'] )
					->setRespostaPerguntaOpcao( $row ['resposta_pergunta_opcao'] )
					->setRespostaPerguntaInteira( $row ['resposta_pergunta_inteira'] )
					->setRespostaPerguntaDecimal( $row ['resposta_pergunta_decimal'] )
					->setFormularioId( $row ['formulario_id'] )
					->setUsuarioExecutorExame( ( int ) $row ['usuario_executor_exame'] )
					->setUsuarioMedicoId( ( int ) $row ['usuario_medico_id'] )
					->build();
			} );

		$first_row = (function (ConsultaDetailsResponseDatabase $formulario_details_response_db): ConsultaDetailsResponseDatabase {
			return $formulario_details_response_db;
		})( $formulario_details_response_db_collection->get( 0 ) );
		$formulario_details_vm->setTitulo( $first_row->getFormularioTitulo() );
		$formulario_details_vm->setDescricao( $first_row->getFormularioDescricao() );
		$formulario_details_vm->setIdMedico( $first_row->getFormularioIdMedico() );
		$formulario_details_vm->setIdAgendamento( $first_row->getIdAgendamento() );
		$formulario_details_vm->setConsultaTitulo( $first_row->getConsultaTitulo() );
		$formulario_details_vm->setConsultaDescricao( $first_row->getConsultaDescricao() );
		$formulario_details_vm->setFormularioId( $formulario_id );
		$formulario_details_vm->setUsuarioExecutorExame( $first_row->getUsuarioExecutorExame() );
		$formulario_details_vm->setUsuarioMedicoId( $first_row->getUsuarioMedicoId() );

		$pergunta_details_collection = new PerguntaDetailsConsultaCollection();
		$formulario_details_response_db_collection->forEach( 
			function (ConsultaDetailsResponseDatabase $formulario_details_response_db) use ($pergunta_details_collection): void {
				$pergunta_already_exists = $pergunta_details_collection->some( 
					function (PerguntaDetailsConsulta $pergunta_details) use ($formulario_details_response_db) {
						return $pergunta_details->getId() === $formulario_details_response_db->getPerguntaId();
					} );
				if (!$pergunta_already_exists) {
					$resposta_consulta_details_dao = new ConsultaDAO();
					$resposta_opcao_query = $resposta_consulta_details_dao->getArrayRespostaOptions( $formulario_details_response_db->getPerguntaId(),
						$formulario_details_response_db->getConsultaId() );
					$pergunta_details = PerguntaDetailsConsulta::builder()->setId( $formulario_details_response_db->getPerguntaId() )
						->setTextoPergunta( $formulario_details_response_db->getPerguntaTextoPergunta() )
						->setIdTipoPergunta( $formulario_details_response_db->getPerguntaIdTipoPergunta() )
						->setObrigatorio( $formulario_details_response_db->getPerguntaObrigatorio() )
						->setPergunta_ativo($formulario_details_response_db->getPergunta_ativo())
						->setPergunta_ordem($formulario_details_response_db->getPergunta_ordem())
						->setOpcoes( new OpcaoDetailsConsultaCollection() )
						->setRespostaPerguntaOpcao( $resposta_opcao_query ?? [ ])
						->setRespostaPerguntaDecimal( $formulario_details_response_db->getRespostaPerguntaDecimal() ?? [ ])
						->setRespostaPerguntaInteira( $formulario_details_response_db->getRespostaPerguntaInteira() ?? [ ])
						->setRespostaPerguntaTextual( $formulario_details_response_db->getRespostaPerguntaTextual() ?? [ ])
						->build();
					$pergunta_details_collection->push( $pergunta_details );
				}
			} );

		$pergunta_details_collection->map( 
			function (PerguntaDetailsConsulta $pergunta_details) use ($formulario_details_response_db_collection): PerguntaDetailsConsulta {
				$opcoes_collection = $pergunta_details->getOpcoes();
				$formulario_details_response_db_collection->forEach( 
					function (ConsultaDetailsResponseDatabase $formulario_details_response_db) use ($opcoes_collection, $pergunta_details): void {
						$opcao_already_exists = $opcoes_collection->some( 
							function (OpcaoDetailsConsulta $opcao_details) use ($formulario_details_response_db) {
								return $opcao_details->getId() === $formulario_details_response_db->getOpcaoPerguntaId();
							} );
						if ($pergunta_details->getId() === $formulario_details_response_db->getOpcaoPerguntaIdPergunta()) {
							if (!$opcao_already_exists) {
								$opcoes_collection->push( 
									OpcaoDetailsConsulta::builder()->setId( $formulario_details_response_db->getOpcaoPerguntaId() )
										->setDescricao( $formulario_details_response_db->getOpcaoPerguntaDescricao() )
										->build() );
							}
						}
					} );
				$pergunta_details->setOpcoes( $opcoes_collection );
				return $pergunta_details;
			}, true );
		$formulario_details_vm->setPerguntas( $pergunta_details_collection );
		return $formulario_details_vm;

	}

	# ---------------------------------------------------------------------------------------------------------------#
	public static function getConsultasByMedicoVMCollectionFromArray(array $result_array): GeneralCollection {

		$consulta_vm_collection = new GeneralCollection();
		foreach ( $result_array as $row ) {
			$consulta_vm_collection->push( self::getConsultaByMedicoVMFromArray( $row ) );
		}
		return $consulta_vm_collection;

	}

	public static function getConsultaByMedicoVMFromArray(array $consulta): ConsultaByMedicoViewModel {

		return ConsultaByMedicoViewModel::builder()->setIdPaciente( $consulta ['id_paciente'] )
			->setNome( $consulta ['nome'] )
			->setCpf( $consulta ['cpf'] )
			->setEmail( $consulta ['email'] )
			->setNumero( $consulta ['numero'] )
			->setComplemento( $consulta ['complemento'] )
			->setReferencias( $consulta ['referencias'] )
			->setCep( $consulta ['cep'] )
			->setCidade( $consulta ['cidade'] )
			->setEstado( $consulta ['estado'] )
			->setLogradouro( $consulta ['logradouro'] )
			->setCidade( $consulta ['cidade'] )
			->build();

	}

	public static function getConsultaByMedicoArrayFromVM(GeneralCollection $consulta_listing_vm): array {

		return $consulta_listing_vm->toArray();

	}

}