<?php

namespace App\Mappers;

use App\DAO\FormaPagamentoDAO;
use App\DAO\PetDAO;
use App\Entities\CEP\CEP;
use App\Entities\Cliente\Cliente;
use App\Entities\ConfirmacaoEmail\ConfirmacaoEmail;
use App\Entities\Endereco\Endereco;
use App\Entities\FormaPagamento\FormaPagamento;
use App\Entities\Pessoa\Pessoa;
use App\Entities\PessoaFisica\PessoaFisica;
use App\Entities\Usuario\Usuario;
use App\Entities\UsuarioPerfil\UsuarioPerfil;
use App\Services\JWTService;
use App\Utils\Collections\GeneralCollection;
use App\Utils\DateUtils;
use App\ViewModels\FormaPagamento\FormaPagamentoDetailsViewModel\FormaPagamentoDetailsViewModel;
use App\ViewModels\FormaPagamento\FormaPagamentoUpdateViewModel\FormaPagamentoUpdateViewModel;
use App\ViewModels\FormaPagamento\FormaPagamentoRegistrationViewModel\FormaPagamentoRegistrationViewModel;

class FormaPagamentoMapper {

	public static function FormaPagamentoRegistrationViewModelMapper(array $centro_custo): FormaPagamentoRegistrationViewModel {

		$jwt_payload = JWTService::getTokenJWTPayload();
		$uid = $jwt_payload ? $jwt_payload->getUid() : null;
		$centro_custo_registration_vm = FormaPagamentoRegistrationViewModel::builder()
            ->setDescricao( $centro_custo ['descricao'])
            ->setDesativadoEm( '' )
            ->setCriadoPor( $uid )
            ->setAlteradoPor( $uid )
            ->setDesativadoPor( null )
            ->build()
        ;

		return $centro_custo_registration_vm;

	}

	public static function getFormaPagamentoFromFormaPagamentoRegistrationVM(FormaPagamentoRegistrationViewModel $centro_custo_registration_vm): FormaPagamento {

		$centro_custo = new FormaPagamento();
		$centro_custo->setDescricao( $centro_custo_registration_vm->getDescricao() );
		$centro_custo->setDesativadoEm( $centro_custo_registration_vm->getDesativadoEm() );
		$centro_custo->setCriadoPor( $centro_custo_registration_vm->getCriadoPor() );
		$centro_custo->setAlteradoPor( $centro_custo_registration_vm->getAlteradoPor() );
		$centro_custo->setDesativadoPor( $centro_custo_registration_vm->getDesativadoPor() );

		return $centro_custo;

	}

	public static function getFormaPagamentoDetailsVMListFromArray(array $centro_custo_list): GeneralCollection {

		$centro_custo_details_vm_collection = new GeneralCollection();
		for($i = 0, $number_pacientes = count( $centro_custo_list ); $i < $number_pacientes; $i ++) {
			$centro_custo_details_vm_collection->push( FormaPagamentoMapper::getFormaPagamentoListVMFromArray( $centro_custo_list [$i] ) );
		}
		return $centro_custo_details_vm_collection;

	}

	public static function getFormaPagamentoDetailsVMListFromArrayToUpdate(array $centro_custo_list): GeneralCollection {

		$centro_custo_details_vm_collection = new GeneralCollection();
		for($i = 0, $number_pacientes = count( $centro_custo_list ); $i < $number_pacientes; $i ++) {
			$centro_custo_details_vm_collection->push( FormaPagamentoMapper::getFormaPagamentoListVMFromArrayToUpdate( $centro_custo_list [$i] ) );
		}
		return $centro_custo_details_vm_collection;

	}

	public static function getFormaPagamentosDetailsArrayFromFormaPagamentoDetailsVMList(GeneralCollection $centro_custo_details_vm_collection): array {

		return $centro_custo_details_vm_collection->toArray();

	}

	public static function getFormaPagamentoListVMFromArray(array &$centro_custo): FormaPagamentoDetailsViewModel {


        $pets = new FormaPagamentoDAO();

		$centro_custo_details_vm = new FormaPagamentoDetailsViewModel();
		$centro_custo_details_vm->setId( $centro_custo ['id'] );
		$centro_custo_details_vm->setDescricao( $centro_custo ['descricao'] );
		$centro_custo_details_vm->setAtualizadoEm( $centro_custo ['atualizado_em'] );
		$centro_custo_details_vm->setAlteradoPor( $centro_custo ['alterado_por'] );
		$centro_custo_details_vm->setCriadoEm( $centro_custo ['criado_em'] );
		$centro_custo_details_vm->setCriadoPor( $centro_custo ['criado_por'] );
		$centro_custo_details_vm->setDesativadoEm( $centro_custo ['desativado_em'] );
		$centro_custo_details_vm->setDesativadoPor( $centro_custo ['desativado_por'] );
		$centro_custo_details_vm->setCodAuth( $centro_custo ['codauth'] ?? 'N' );
		return $centro_custo_details_vm;

	}

	public static function getFormaPagamentoListVMFromArrayToUpdate(array &$centro_custo): FormaPagamentoDetailsViewModel {

		// $centro_custo_details_vm = FormaPagamentoDetailsViewModel::builder()->setId( $centro_custo ['id'] )->setCpf( $centro_custo ['cpf'] )->setIdCliente( $centro_custo ['id_cliente'] )->setRg( $centro_custo ['rg'] )->setNome( $centro_custo ['nome'] )->setGenero( $centro_custo ['genero'] )->setDataNascimento( $centro_custo ['data_nascimento'] )->setTelefone1( $centro_custo ['telefone_1'] )->setTelefone2( $centro_custo ['telefone_2'] )->setObservacao( $centro_custo ['observacao'] )->setCep( $centro_custo ['cep'] )->setNumero( $centro_custo ['numero'] )->setComplemento( $centro_custo ['complemento'] )->setReferencias( $centro_custo ['referencias'] )->setEstado( $centro_custo ['estado'] )->setCidade( $centro_custo ['cidade'] )->setBairro( $centro_custo ['bairro'] )->setLogradouro( $centro_custo ['logradouro'] )->setEmail( $centro_custo ['email'] )->setFoto( $centro_custo ['foto'] )->setIndicadoPor( $centro_custo ['indicado_por'] )->setProfissao( $centro_custo ['profissao'] )->setEstadoCivil( $centro_custo ['estado_civil'] )->setConvenio( $centro_custo ['convenio'] )->build();
		$centro_custo_details_vm = new FormaPagamentoDetailsViewModel();
        $centro_custo_details_vm->setId( $centro_custo ['id'] );
        $centro_custo_details_vm->setDescricao( $centro_custo ['descricao'] );
        $centro_custo_details_vm->setAtualizadoEm( $centro_custo ['atualizado_em'] );
        $centro_custo_details_vm->setAlteradoPor( $centro_custo ['alterado_por'] );
        $centro_custo_details_vm->setCriadoEm( $centro_custo ['criado_em'] );
        $centro_custo_details_vm->setCriadoPor( $centro_custo ['criado_por'] );
        $centro_custo_details_vm->setDesativadoEm( $centro_custo ['desativado_em'] );
        $centro_custo_details_vm->setDesativadoPor( $centro_custo ['desativado_por'] );

		return $centro_custo_details_vm;

	}

	public static function getFormaPagamentoDetailsVMFromArray(array &$centro_custo): FormaPagamentoDetailsViewModel {

		$centro_custo_details_vm = new FormaPagamentoDetailsViewModel();
        $centro_custo_details_vm->setId( $centro_custo ['id'] );
        $centro_custo_details_vm->setDescricao( $centro_custo ['descricao'] );
        $centro_custo_details_vm->setAtualizadoEm( $centro_custo ['atualizado_em'] );
        $centro_custo_details_vm->setAlteradoPor( $centro_custo ['alterado_por'] );
        $centro_custo_details_vm->setCriadoEm( $centro_custo ['criado_em'] );
        $centro_custo_details_vm->setCriadoPor( $centro_custo ['criado_por'] );
        $centro_custo_details_vm->setDesativadoEm( $centro_custo ['desativado_em'] );
        $centro_custo_details_vm->setDesativadoPor( $centro_custo ['desativado_por'] );

		return $centro_custo_details_vm;

	}

	public static function getFormaPagamentoUpdateVMFromArray(array $centro_custo_data): FormaPagamentoUpdateViewModel {

		$centro_custo_update_vm = new FormaPagamentoUpdateViewModel();
		if (isset( $centro_custo_data ['descricao'] )) {
			$centro_custo_update_vm->setDescricao( $centro_custo_data ['descricao'] );
		}
		$centro_custo_update_vm->setAlteradoPor( JWTService::getTokenJWTPayload()->getUid() );
		return $centro_custo_update_vm;

	}

	public static function getFormaPagamentoFromFormaPagamentoUpdateVM(FormaPagamentoUpdateViewModel $centro_custo_update_vm): FormaPagamento {

		$centro_custo = new FormaPagamento();

		if ($centro_custo_update_vm->getDescricao()) {
			$centro_custo->setDescricao( $centro_custo_update_vm->getDescricao() );
		}
		if ($centro_custo_update_vm->getAtualizadoEm()) {
			$centro_custo->setAtualizadoEm( $centro_custo_update_vm->getAtualizadoEm() );
		}
		if ($centro_custo_update_vm->getAlteradoPor()) {
			$centro_custo->setAlteradoPor( $centro_custo_update_vm->getAlteradoPor() );
		}
		return $centro_custo;

	}

	# -------------------------------------------------------------------------------------------------------------- #
	public static function getFormaPagamentoUpdateObservacaoVMFromArray(array $centro_custo_data): FormaPagamentoUpdateViewModel {
		$centro_custo_update_vm = new FormaPagamentoUpdateViewModel();
		if (isset( $centro_custo_data ['observacao'] )) {
			$centro_custo_update_vm->setObservacao( $centro_custo_data ['observacao'] );
		}
		return $centro_custo_update_vm;

	}

}
