<?php

namespace App\Mappers;

use App\Entities\Extorno\Extorno;
use App\ViewModels\Extorno\ExtornoRegistrationViewModel\ExtornoRegistrationViewModel;
use App\Services\JWT\UsuarioLogado;
use App\Utils\DateUtils;
use App\Utils\Collections\GeneralCollection;
use App\ViewModels\Extorno\ExtornoDetailsViewModel\ExtornoDetailsViewModel;

class ExtornoMapper {

	public static function getExtornoRegistrationVMFromRequest($data_request): ExtornoRegistrationViewModel {

		$usr_id = UsuarioLogado::getUsuarioId();
		$data_criacao = DateUtils::today();
		$hora_criacao = DateUtils::now_time();

		$extorno_registration_vm = ExtornoRegistrationViewModel::builder()->setIdComanda( intval( $data_request->comanda_id ) )
			->setIdTipoExtorno( intval( $data_request->tipo_id ) )
			->setCriadoPor( intval( $usr_id ) )
			->setDataCriacao( $data_criacao )
			->setHoraCriacao( $hora_criacao )
			->setObservacao( $data_request->observacao ?? '')
			->setValor( $data_request->valor )
			->build();
		return $extorno_registration_vm;

	}

	public static function getExtornoFromExtornoRegistrationVM(ExtornoRegistrationViewModel $extorno_registration_vm): Extorno {

		$usr_id = UsuarioLogado::getUsuarioId();
		$data_criacao = DateUtils::today();
		$hora_criacao = DateUtils::now_time();
		$extorno = Extorno::builder()->setIdComanda( $extorno_registration_vm->getIdComanda() )
			->setIdTipoExtorno( $extorno_registration_vm->getIdTipoExtorno() )
			->setCriadoPor( $usr_id )
			->setDataCriacao( $extorno_registration_vm->getDataCriacao() ?? $data_criacao)
			->setHoraCriacao( $extorno_registration_vm->getHoraCriacao() ?? $hora_criacao)
			->setValor( $extorno_registration_vm->getValor() )
			->setObservacao( $extorno_registration_vm->getObservacao() ?? '')
			->build();
		return $extorno;

	}

	// public static function getAgendamentoPetFromAgendamentoRegistrationVM(AgendamentoRegistrationViewModel $agendamento_registration_vm,
	// Agendamento $agendamento): AgendamentoPet {

	// $codigo = $agendamento_registration_vm->getIdAgenda();
	// $agendamento = AgendamentoPet::builder()->setIdPet( $agendamento_registration_vm->getIdPet() )
	// ->setIdAgendamento( $agendamento->getId() )
	// ->build();
	// return $agendamento;

	// }

	// public static function getAgendamentoUpdateVMFromArray(array $data): AgendamentoUpdateViewModel {

	// $agendamento_update_vm = AgendamentoUpdateViewModel::builder()->setAtrasado( $data ['atrasado'] )
	// ->setIdPaciente( $data ['id_paciente'] )
	// ->setIdProcedimento( $data ['id_procedimento'] )
	// ->setIdCliente( $data ['id_cliente'] )
	// ->setIdAgenda( $data ['id_agenda'] )
	// ->build();
	// if (count( $agendamento_update_vm->toArray( true ) ) === 0) {
	// throw new ResponseException( [ ], 'Dados insuficientes para fazer a atualização.' );
	// } else {
	// return $agendamento_update_vm;
	// }

	// }

	// public static function getAgendamentoFromAgendamentoUpdateVM(AgendamentoUpdateViewModel $agendamento_update_vm): Agendamento {

	// $agendamento = new Agendamento();
	// if ($agendamento_update_vm->getIdAgenda() !== null) {
	// $agendamento->setIdAGENDA( $agendamento_update_vm->getIdAgenda() );
	// $agendamento->setCodigo( ( string ) $agendamento_update_vm->getIdAgenda() );
	// }
	// if ($agendamento_update_vm->getIdProcedimento() !== null) {
	// $agendamento->setIdPROCEDIMENTO( $agendamento_update_vm->getIdProcedimento() );
	// }
	// if ($agendamento_update_vm->getIdPaciente() !== null) {
	// $agendamento->setIdPACIENTE( $agendamento_update_vm->getIdPaciente() );
	// }
	// if ($agendamento_update_vm->getIdCliente() !== null) {
	// $agendamento->setIdCLIENTE( $agendamento_update_vm->getIdCliente() );
	// }
	// if ($agendamento_update_vm->getAtrasado() !== null) {
	// $agendamento->setAtrasado( $agendamento_update_vm->getAtrasado() );
	// }
	// $jwt_payload = JWTService::getTokenJWTPayload();
	// $agendamento->setAlteradoPor( $jwt_payload->getUid() );
	// $agendamento->setAlteradoEm( DateUtils::now() );
	// return $agendamento;

	// }

	// public static function getAgendamentoInfoVMFromArray(array $response_array): AgendamentoInfoViewModel {

	// return AgendamentoInfoViewModel::builder()->setIdAgenda( $response_array ['id_agenda'] )
	// ->setIdCliente( $response_array ['id_cliente'] )
	// ->setIdPaciente( $response_array ['id_paciente'] )
	// ->setIdConsulta( $response_array ['id_consulta'] )
	// ->setIdUsuario( $response_array ['id_usuario'] )
	// ->build();

	// }

	# ---------------------------------------------------------------------------------------------------------------#
	public static function getExtornoDetailsVMFromArray($extorno): ExtornoDetailsViewModel {

		/*
		 * e.id ,e.id_comanda, c.id_unidade , un.descricao ,
		 * e.id_tipo_extorno,te.descricao, e.valor,
		 * e.criado_por, pf.nome,
		 * e.data_criacao, e.hora_criacao, e.observacao
		 */
		$extorno_details_vm = ExtornoDetailsViewModel::builder()->setId( $extorno ['id'] )
			->setIdComanda( $extorno ['id_comanda'] )
			->setIdUnidade( $extorno ['id_unidade'] )
			->setNomeUnidade( $extorno ['nome_unidade'] )
			->setIdTipoExtorno( $extorno ['id_tipo_extorno'] )
			->setDescricaoTipoExtorno( $extorno ['tipo_estorno'] )
			->setCriadoPor( $extorno ['criado_por'] )
			->setNome( $extorno ['nome'] )
			->setDataCriacao( $extorno ['data_criacao'] )
			->setHoraCriacao( $extorno ['hora_criacao'] )
			->setValor( $extorno ['valor'] )
			->setObservacao( $extorno ['observacao'] )
			->build();

		return $extorno_details_vm;

	}

	public static function getExtornoDetailsVMListFromArray(array $extorno_list): GeneralCollection {

		$extorno_details_vm_collection = new GeneralCollection();
		$number_extornos = count( $extorno_list );
		for($i = 0; $i < $number_extornos; $i++) {
			$extorno_details_vm_collection->push( ExtornoMapper::getExtornoDetailsVMFromArray( $extorno_list [$i] ) );
		}
		return $extorno_details_vm_collection;

	}

	public static function getExtornoDetailsArrayFromExtornoDetailsVMCollection(GeneralCollection $extorno_details_vm_collection): array {

	 return $extorno_details_vm_collection->toArray();

	 }
}

