<?php

namespace App\Mappers;

use App\DAO\ProcedimentoValorDAO;
use App\Entities\ProcedimentoValor\ProcedimentoValor;
use App\Services\JWTService;
use App\Utils\Collections\GeneralCollection;
use App\ViewModels\ProcedimentoValor\ProcedimentoSemValorDetailsViewModel\ProcedimentoSemValorDetailsViewModel;
use App\ViewModels\ProcedimentoValor\ProcedimentoValorDetailsViewModel\ProcedimentoValorDetailsViewModel;
use App\ViewModels\ProcedimentoValor\ProcedimentoValorRegistrationViewModel\ProcedimentoValorRegistrationViewModel;
use App\ViewModels\ProcedimentoValor\ProcedimentoValorUpdateViewModel\ProcedimentoValorUpdateViewModel;
use App\Entities\ConvenioProcedimento\ConvenioProcedimento;

class ProcedimentoValorMapper {

	public static function getProcedimentoValorRegistrationVMFromArray(array $data): ProcedimentoValorRegistrationViewModel {

		return ProcedimentoValorRegistrationViewModel::builder()->setIdConvenioProcedimento( 0 )
			->setIdConvenio( $data ['id_convenio'] )
			->setIdProcedimento( $data ['id_procedimento'] )
			->setIdUnidade( $data ['id_unidade'] )
			->setValor( $data ['valor'] )
			->setValorInterno( $data ['valor_interno'] ?? 0.00)
			->setValorRepasseMedico( $data ['valor_repasse_medico'] ?? 0.00)
			->setDataFim( '1900-01-01' )
			->setDataInicio( $data ['data_inicio'] )
			->build();

	}

	public static function getProcedimentoValorFromProcedimentoValorRegistrationVM(ProcedimentoValorRegistrationViewModel $procedimento_registration_vm): ProcedimentoValor {

		return ProcedimentoValor::builder()->setId_convenio_procedimento( $procedimento_registration_vm->getIdConvenioProcedimento() )
			->setValor( $procedimento_registration_vm->getValor() )
			->setValorInterno( $procedimento_registration_vm->getValorInterno() )
			->setValorRepasseMedico( $procedimento_registration_vm->getValorRepasseMedico() )
			->setData_inicio( $procedimento_registration_vm->getDataInicio() )
			->setData_fim( $procedimento_registration_vm->getDataFim() )
			->setStatus(1)
			->build();

	}

	public static function getProcedimentoValorToRegisterConvenioProcedimento(ProcedimentoValorRegistrationViewModel $procedimento_registration_vm, $idusr): ConvenioProcedimento {

		return ConvenioProcedimento::builder()->setId( 0 )
			->setId_convenio( $procedimento_registration_vm->getIdConvenio() )
			->setId_procedimento( $procedimento_registration_vm->getIdProcedimento() )
			->setId_unidade( $procedimento_registration_vm->getIdUnidade() )
			->setCriado_por( $idusr )
			->setAlterado_por( $idusr )
			->build();

	}

	public static function getProcedimentoValorDetailsVMFromArray(array $procedimento): ProcedimentoValorDetailsViewModel {

		return ProcedimentoValorDetailsViewModel::builder()->setId( $procedimento ['id'] )
			->setValor( $procedimento ['valor'] )
			->setValorInterno( $procedimento ['valor_interno'] )
			->setValorRepasseMedico( $procedimento ['valor_repasse_medico'] )
			->setIdConvenioProcedimento( $procedimento ['id_convenio_procedimento'] )
			->setDataInicio( $procedimento ['data_inicio'] )
			->setDataFim( $procedimento ['data_fim'] )
			->setIdConvenio( $procedimento ['id_convenio'] )
			->setDescricaoConvenio( $procedimento ['descricao_convenio'] )
			->setCodigoConvenio( $procedimento ['codigo_convenio'] )
			->setIdProcedimento( $procedimento ['id_procedimento'] )
			->setDescricaoProcedimento( $procedimento ['descricao_procedimento'] )
			->setDescricaoTipoProcedimento( $procedimento ['descricao_tipo_procedimento'] )
			->setIdUnidade( $procedimento ['id_unidade'] )
			->setDescricaoUnidade( $procedimento ['descricao_unidade'] )
			->setStatus( $procedimento ['status'] )
			->build();

	}

	# ---------------------------------------------------------------------------------------------------------#
	public static function getProcedimentoValorDetailsVMCollectionFromArray(array $response_array): GeneralCollection {

		$procedimento_details_vm_collection = new GeneralCollection();
		foreach ( $response_array as $row ) {
			$procedimento_dao = new ProcedimentoValorDAO();
			$procedimento_details_vm = ProcedimentoValorMapper::getProcedimentoValorDetailsVMFromArray( $row );
			$procedimento_details_vm_collection->push( $procedimento_details_vm );
		}
		return $procedimento_details_vm_collection;

	}

	# -----------------------------------------------------------------------------------------------------------------------#
	public static function getConvenioProcedimentoNotValorVMCollectionFromArray(array $response_array): GeneralCollection {

		$procedimento_details_vm_collection = new GeneralCollection();
		foreach ( $response_array as $row ) {
			$procedimento_dao = new ProcedimentoValorDAO();
			$procedimento_details_vm = ProcedimentoValorMapper::getProcedimentoSemValorDetailsVMFromArray( $row );
			$procedimento_details_vm_collection->push( $procedimento_details_vm );
		}
		return $procedimento_details_vm_collection;

	}

	public static function getProcedimentoSemValorDetailsVMFromArray(array $procedimento): ProcedimentoSemValorDetailsViewModel {

		return ProcedimentoSemValorDetailsViewModel::builder()->setIdProcedimento( $procedimento ['id_procedimento'] )
			->setDescricaoProcedimento( $procedimento ['descricao_procedimento'] )
			->setCriadoPor( $procedimento ['criado_por'] )
			->setCriadoEm( $procedimento ['criado_em'] )
			->setIdTipoProcedimento( $procedimento ['id_tipo_procedimento'] )
			->setIdConvenioProcedimento( $procedimento ['id_convenio_procedimento'] )
			->build();

	}

	# -----------------------------------------------------------------------------------------------------------------------#
	public static function getProcedimentoValorsDetailsArrayFromProcedimentoValorDetailsVMCollection(GeneralCollection $paciente_details_vm_collection): array {

		return $paciente_details_vm_collection->toArray();

	}

	public static function getProcedimentoValorFromProcedimentoValorUpdateVM(ProcedimentoValorUpdateViewModel $procedimento_update_vm): ProcedimentoValor {

		$procedimento = new ProcedimentoValor();
		if ($procedimento_update_vm->getValor()) {
			$procedimento->setValor( $procedimento_update_vm->getValor() );
		}
		if ($procedimento_update_vm->getValorInterno()) {
			$procedimento->setValorInterno( $procedimento_update_vm->getValorInterno() );
		}
        if ($procedimento_update_vm->getValorRepasseMedico()) {
            $procedimento->setValorRepasseMedico( $procedimento_update_vm->getValorRepasseMedico() );
        }
		return $procedimento;

	}

	public static function getProcedimentoValorUpdateVMFromArray(array $data): ProcedimentoValorUpdateViewModel {

		$procedimento_update_vm = new ProcedimentoValorUpdateViewModel();
		if (isset( $data ['valor'] )) {
			$procedimento_update_vm->setValor( $data ['valor'] );
		}
		if (isset( $data ['valor_interno'] )) {
			$procedimento_update_vm->setValorInterno( $data ['valor_interno'] );
		}
        if (isset( $data ['valor_repasse_medico'] )) {
            $procedimento_update_vm->setValorRepasseMedico( $data ['valor_repasse_medico'] );
        }
		return $procedimento_update_vm;

	}

}