<?php


namespace App\Mappers;

use App\DAO\ProcedimentoDAO;
use App\Entities\Procedimento\Procedimento;
use App\Entities\ProcedimentoExame\ProcedimentoExame;
use App\Entities\TipoProcedimento\TipoProcedimento;
use App\Services\JWTService;
use App\Utils\Collections\GeneralCollection;
use App\Utils\Collections\TipoProcedimentoDetailsVMCollection;
use App\ViewModels\Procedimento\ProcedimentoUpdateViewModel\ProcedimentoUpdateViewModel;
use App\ViewModels\Procedimento\ProcedimentoDetailsViewModel\ProcedimentoDetailsViewModel;
use App\ViewModels\Procedimento\ProcedimentoRegistrationViewModel\ProcedimentoRegistrationViewModel;
use App\ViewModels\TipoProcedimento\TipoProcedimentoDetailsViewModel\TipoProcedimentoDetailsViewModel;
use App\ViewModels\TipoProcedimento\TipoProcedimentoRegistrationViewModel\TipoProcedimentoRegistrationViewModel;

class ProcedimentoMapper {

	public static function getProcedimentoRegistrationVMFromArray(array $data): ProcedimentoRegistrationViewModel {

		return ProcedimentoRegistrationViewModel::builder()->setDescricao( $data ['descricao'] )
			->setIdTIPOPROCEDIMENTO( $data ['id_tipo_procedimento'] )
			->setExame( $data ['exames'] ?? [ ])
			->setCriadoPor( JWTService::getTokenJWTPayload()->getUid() )
			->build();

	}

	public static function getProcedimentoFromProcedimentoRegistrationVM(ProcedimentoRegistrationViewModel $procedimento_registration_vm): Procedimento {

		return Procedimento::builder()->setIdTIPOPROCEDIMENTO( $procedimento_registration_vm->getIdTIPOPROCEDIMENTO() )
			->setDescricao( $procedimento_registration_vm->getDescricao() )
			->setCriadoPor( $procedimento_registration_vm->getCriadoPor() )
			->setAlteradoPor( $procedimento_registration_vm->getCriadoPor() )
			->build();

	}

	public static function getProcedimentoExameFromProcedimentoRegistrationVM(int $exame_id, int $procedimento_id): ProcedimentoExame {

		return ProcedimentoExame::builder()->setIdEXAME( $exame_id ?? null)
			->setIdPROCEDIMENTO( $procedimento_id )
			->build();

	}

	public static function getProcedimentoDetailsVMFromArray(array $procedimento, array $exames): ProcedimentoDetailsViewModel {

		return ProcedimentoDetailsViewModel::builder()->setId( $procedimento ['id'] )
			->setDescricao( $procedimento ['descricao'] )
			->setIdTIPOPROCEDIMENTO( $procedimento ['id_tipo_procedimento'] )
			->setTipoProcedimento( $procedimento ['tipo_procedimento'] )
			->setExames( $exames )
			->build();

	}

	public static function getProcedimentoDetailsVMCollectionFromArray(array $response_array): GeneralCollection {

		$procedimento_details_vm_collection = new GeneralCollection();
		// getExamesFromProcedimentos
		$procedimentoIdList = [ ];
		foreach ( $response_array as $row ) {
			$procedimentoIdList [] = ( int ) $row ['id'];
			$procedimento_details_vm = ProcedimentoMapper::getProcedimentoDetailsVMFromArray( $row, [ ] );
			$procedimento_details_vm_collection->push( $procedimento_details_vm );
		}
		$exames = (new ProcedimentoDAO())->getExamesFromProcedimentos( $procedimentoIdList );
		$procedimento_details_vm_collection->map( 
				function (ProcedimentoDetailsViewModel $p) use ($exames) {
					$examesFiltered = [ ];
					foreach ( $exames as $exame ) {
						if ($exame ['procedimento_id'] == $p->getId()) {
							$examesFiltered [] = [ 
									'id' => ( int ) $exame ['id'],
									'nome' => $exame ['nome']
							];
						}
					}
					$p->setExames( $examesFiltered );
					return $p;
				}, true );
		return $procedimento_details_vm_collection;

	}

	public static function getProcedimentosDetailsArrayFromProcedimentoDetailsVMCollection(GeneralCollection $paciente_details_vm_collection): array {

		return $paciente_details_vm_collection->toArray();

	}

	public static function getProcedimentoUpdateVMFromArray(array $data): ProcedimentoUpdateViewModel {

		$procedimento_update_vm = new ProcedimentoUpdateViewModel();
		if (isset( $data ['descricao'] )) {
			$procedimento_update_vm->setDescricao( $data ['descricao'] );
		}
		if (isset( $data ['id_tipo_procedimento'] )) {
			$procedimento_update_vm->setIdTipoProcedimento( $data ['id_tipo_procedimento'] );
		}
		if (isset( $data ['exames'] )) {
			$procedimento_update_vm->setExames( $data ['exames'] );
		}
		$procedimento_update_vm->setAlteradoPor( JWTService::getTokenJWTPayload()->getUid() );
		return $procedimento_update_vm;

	}

	public static function getProcedimentoFromProcedimentoUpdateVM(ProcedimentoUpdateViewModel $procedimento_update_vm): Procedimento {

		$procedimento = new Procedimento();
		if ($procedimento_update_vm->getDescricao()) {
			$procedimento->setDescricao( $procedimento_update_vm->getDescricao() );
		}
		if ($procedimento_update_vm->getIdTipoProcedimento()) {
			$procedimento->setIdTIPOPROCEDIMENTO( $procedimento_update_vm->getIdTipoProcedimento() );
		}
		$procedimento->setAlteradoPor( $procedimento_update_vm->getAlteradoPor() );
		return $procedimento;

	}

}