<?php

namespace App\Mappers;

use App\DAO\ProcedimentoDAO;
use App\Entities\ComandaFechamento\ComandaFechamento;
use App\Entities\ComandaLancamento\ComandaLancamento;
use App\Entities\ComandaPagamento\ComandaPagamento;
use App\Entities\Procedimento\Procedimento;
use App\Entities\ProcedimentoExame\ProcedimentoExame;
use App\Services\JWTService;
use App\Services\JWT\UsuarioLogado;
use App\Utils\DateUtils;
use App\Utils\GeneralUtils;
use App\Utils\Collections\GeneralCollection;
use App\ViewModels\Pagamento\PagamentoComandaFechamentoRegistrationViewModel\PagamentoComandaFechamentoViewModel;
use App\ViewModels\Pagamento\PagamentoComandaFormaPagamentoRegistrationViewModel\FormaPagamentoBoletoViewModel;
use App\ViewModels\Pagamento\PagamentoComandaFormaPagamentoRegistrationViewModel\FormaPagamentoCartaoViewModel;
use App\ViewModels\Pagamento\PagamentoComandaFormaPagamentoRegistrationViewModel\FormaPagamentoCreditoClienteViewModel;
use App\ViewModels\Pagamento\PagamentoComandaFormaPagamentoRegistrationViewModel\FormaPagamentoDinheiroViewModel;
use App\ViewModels\Pagamento\PagamentoComandaFormaPagamentoRegistrationViewModel\FormaPagamentoPixViewModel;
use App\ViewModels\Pagamento\PagamentoComandaFormaPagamentoRegistrationViewModel\PagamentoComandaFormaPagamentoViewModel;
use App\ViewModels\Pagamento\PagamentoComandaLancamentoRegistrationViewModel\PagamentoComandaLancamentoViewModel;
use App\ViewModels\Pagamento\PagamentoComandaPagamentoRegistrationViewModel\PagamentoComandaPagamentoViewModel;
use App\ViewModels\Procedimento\ProcedimentoDetailsViewModel\ProcedimentoDetailsViewModel;
use App\ViewModels\Procedimento\ProcedimentoRegistrationViewModel\ProcedimentoRegistrationViewModel;
use App\ViewModels\Procedimento\ProcedimentoUpdateViewModel\ProcedimentoUpdateViewModel;

// use const False\MyClass\true;
class PagamentoMapper {

	public static function getPagamentoFechamentoRegistrationVMfromFrom($pagamento): PagamentoComandaFechamentoViewModel {

		$usr = UsuarioLogado::getUsuarioId();
		$teste = $pagamento->valor_total;
		return PagamentoComandaFechamentoViewModel::builder()->setId( 0 )
			->setValor( $pagamento->valor_total ?? 0.00)
			->setComandaId( $pagamento->comanda_id )
			->setTipoFechamento( "pagamento" )
			->setCriado_por( $usr )
			->setDataCriacao( "1900-01-01" )
			->setHoraCriacao( "00:00:00" )
			->setAtualizado_por( 0 )
			->setDataAtualizacao( "1900-01-01" )
			->setHoraAtualizacao( "00:00:00" )
			->build();

	}

	public static function getPagamentoLancamentoRegistrationVMfromFrom($pagamento): array {

		$usr = UsuarioLogado::getUsuarioId();
		$lista_itens = array ();

		$itens = $pagamento->comanda_itens;
		$size = count( $itens );
		for($i = 0; $i < $size; $i++) {
			$obj = PagamentoComandaLancamentoViewModel::builder()->setId( 0 )
				->setComandaItemId( $itens [$i]->comanda_item_id )
				->setComandaFechamentoId( 0 )
				->setCriado_por( $usr )
				->setDataCriacao( "1900-01-01" )
				->setHoraCriacao( "00:00:00" )
				->setAtualizado_por( 0 )
				->setDataAtualizacao( "1900-01-01" )
				->setHoraAtualizacao( "00:00:00" )
				->setExtornado( "N" )
				->build();
			array_push( $lista_itens, $obj );
		}

		return $lista_itens;

	}

	public static function getFormaPagamentoRegistrationVMfromFrom($pagamento): array {

		$lista_itens = array ();
		$itens = $pagamento->formas_pagamento;
		$size = count( $itens );

		for($i = 0; $i < $size; $i++) {
			$card = "";
			$pix = "";
			$dinheiro = "";
			$creditoCliente = array ();
			$boleto = "";

			switch (intval( $itens [$i]->forma_id )) {
				case FORMAPAGAMENTO_CARTAOCREDITO :
					$card = PagamentoMapper::getFormaPagamentoCartaoRegistartionfromForm( $itens [$i]->card );

					break;
				case FORMAPAGAMENTO_CARTAODEBITO :
					$card = PagamentoMapper::getFormaPagamentoCartaoRegistartionfromForm( $itens [$i]->card );
					break;
				case FORMAPAGAMENTO_PIX :
					$pix = PagamentoMapper::getFormaPagamentoPixRegistartionfromForm( $itens [$i]->pix );
					break;
				case FORMAPAGAMENTO_FILANTROPIA :
					break;
				case FORMAPAGAMENTO_SUSANIMAL :
					break;
				case FORMAPAGAMENTO_NOTAPROMISSORIA :
					break;
				case FORMAPAGAMENTO_DINHEIRO :
					$dinheiro = PagamentoMapper::getFormaPagamentoDinheiroRegistartionfromForm( $itens [$i]->dinheiro );
					break;
				case FORMAPAGAMENTO_ANTECIPADO :
					break;
				case FORMAPAGAMENTO_CREDITOCLIENTE :
					for($x = 0; $x < count( $itens [$i]->creditocliente ); $x++) {
						$obj = PagamentoMapper::getFormaPagamentoCreditoClienteRegistartionfromForm( $itens [$i]->creditocliente [$x] );
						array_push( $creditoCliente, $obj );
					}
					break;
				case FORMAPAGAMENTO_BOLETO :
					$boleto = PagamentoMapper::getFormaPagamentoBoletRegistartionfromForm( $itens [$i]->boleto );
					break;
			}

			if ($dinheiro == "") {
				$dinheiro = 0;
			}
			
			$obj = PagamentoComandaFormaPagamentoViewModel::builder()->setId( 0 )
				->setFormaId( $itens [$i]->forma_id )
				->setValor( $itens [$i]->valor )
				->setObservacao( $itens [$i]->observacao )
				->setCard( $card )
				->setBoleto( $boleto )
				->setDinheiro( $dinheiro )
				->setPix( $pix )
				->setCreditoCliente( $creditoCliente )
				->build();
			array_push( $lista_itens, $obj );
		}

		return $lista_itens;

	}

	public static function getFormaPagamentoCartaoRegistartionfromForm($dados): FormaPagamentoCartaoViewModel {

		$usuarioid = UsuarioLogado::getUsuarioId();
		$cod = GeneralUtils::getAutoCodGenerateByUserId( $usuarioid );

		if (trim( $dados->codauth ) == "") {
			$dados->codauth = $cod;
		}
		$obj = FormaPagamentoCartaoViewModel::builder()->setNumero( $dados->number )
			->setMesVal( $dados->mes_val )
			->setAnoVal( $dados->ano_val )
			->setMaquineta( $dados->maquineta ?? "S")
			->setCvv( $dados->cvv )
			->setBandeira( $dados->bandeira )
			->setDebcred( $dados->debcred )
			->setCodauth( $dados->codauth )
			->setTitular( $dados->titular )
			->build();
		return $obj;

	}

	public static function getDefaultFormaPagamentoCartaoRegistartionfromForm(): FormaPagamentoCartaoViewModel {

		$usuarioid = UsuarioLogado::getUsuarioId();
		$cod = GeneralUtils::getAutoCodGenerateByUserId( $usuarioid );

		$obj = FormaPagamentoCartaoViewModel::builder()->setNumero( '' )
			->setMesVal( '' )
			->setAnoVal( '' )
			->setMaquineta( 'N' )
			->setCvv( '' )
			->setBandeira( '' )
			->setDebcred( '' )
			->setCodauth( $cod )
			->setTitular( '' )
			->build();
		return $obj;

	}

	public static function getFormaPagamentoCreditoClienteRegistartionfromForm($dados): FormaPagamentoCreditoClienteViewModel {

		$usr = UsuarioLogado::getUsuarioId();

		$obj = FormaPagamentoCreditoClienteViewModel::builder()->setCreditoId( $dados->credito_id )
			->setValorTotal( $dados->valor_total )
			->setValorUsado( $dados->valor_usado )
			->setGerarCredito( $dados->gerar_credito ?? "N")
			->build();
		return $obj;

	}

	public static function getFormaPagamentoBoletRegistartionfromForm($dados): FormaPagamentoBoletoViewModel {

		$obj = FormaPagamentoBoletoViewModel::builder()->setNumero( $dados->number ?? '')
			->setDataVenc( $dados->data_venc ?? '')
			->build();
		return $obj;

	}

	public static function getDefaultFormaPagamentoBoletRegistartionfromForm(): FormaPagamentoBoletoViewModel {

		$obj = FormaPagamentoBoletoViewModel::builder()->setNumero( '' )
			->setDataVenc( '' )
			->build();
		return $obj;

	}

	public static function getFormaPagamentoDinheiroRegistartionfromForm($dados): FormaPagamentoDinheiroViewModel {

		$obj = FormaPagamentoDinheiroViewModel::builder()->setValor( $dados->valor ?? 0.00)
			->setTroco( $dados->troco ?? 0.00)
			->build();
		return $obj;

	}

	public static function getDefaultFormaPagamentoDinheiroRegistartionfromForm(): FormaPagamentoDinheiroViewModel {

		$obj = FormaPagamentoDinheiroViewModel::builder()->setValor( 0.00 )
			->setTroco( 0.00 )
			->build();
		return $obj;

	}

	public static function getFormaPagamentoPixRegistartionfromForm($dados): FormaPagamentoPixViewModel {

		$obj = FormaPagamentoPixViewModel::builder()->setChave( $dados->chave ?? '')
			->setValor( $dados->valor ?? 0.00)
			->build();
		return $obj;

	}

	public static function getDefaultFormaPagamentoPixRegistartionfromForm(): FormaPagamentoPixViewModel {

		$obj = FormaPagamentoPixViewModel::builder()->setChave( '' )
			->setValor( 0.00 )
			->build();
		return $obj;

	}

	public static function getPagamentoComandaRegistrationVMfromFrom($pagamento): array {

		$usr = UsuarioLogado::getUsuarioId();
		$lista_itens = array ();
		$itens = $pagamento->formas_pagamento;
		$size = count( $itens );

		for($i = 0; $i < $size; $i++) {
			
			if($itens [$i]->dinheiro->valor == "") {
				$itens [$i]->dinheiro->valor =0.0;
			}
			if($itens [$i]->dinheiro->troco == "") {
				$itens [$i]->dinheiro->troco =0.0;
			}
			
			$obj = PagamentoComandaPagamentoViewModel::builder()->setId( 0 )
				->setComandaFechamentoId( 0 )
				->setFormaPagamentoId( $itens [$i]->forma_id )
				->setValor( $itens [$i]->valor ?? 0.00)
				->setBandeira( " " )
				->setCodauth( " " )
				->setDbtcrd( " " )
				->setMaquineta( " " )
				->setDinheiro( $itens [$i]->dinheiro->valor)
				->setTroco( $itens [$i]->dinheiro->troco)
				->setChavePix( "" )
				->setObservacao( $itens [$i]->observacao ?? "")
				->setCriado_por( $usr )
				->setDataCriacao( "1900-01-01" )
				->setHoraCriacao( "00:00:00" )
				->setAtualizado_por( 0 )
				->setDataAtualizacao( "1900-01-01" )
				->setHoraAtualizacao( "00:00:00" )
				->build();
			array_push( $lista_itens, $obj );
		}
		return $lista_itens;

	}

	public static function getComandaFechamentoFromPagamentoComandaFechamentoRegistrationVM(PagamentoComandaFechamentoViewModel $pagamento_fechamento_vm): ComandaFechamento {

		return ComandaFechamento::builder()->setComanda_id( $pagamento_fechamento_vm->getComandaId() )
			->setCriado_por( $pagamento_fechamento_vm->getCriado_por() )
			->setValor( $pagamento_fechamento_vm->getValor() )
			->setTipo_fechamento( $pagamento_fechamento_vm->getTipoFechamento() )
			->setData_criacao( DateUtils::today() )
			->setHora_criacao( DateUtils::now_time() )
			->build();

	}

	public static function getComandaLancamantoFromPagamentoComandaLancamentoRegistrationVM(PagamentoComandaLancamentoViewModel $pagamento_lancamento_vm): ComandaLancamento {

		return ComandaLancamento::builder()->setComanda_fechamento_id( $pagamento_lancamento_vm->getComandaFechamentoId() )
			->setComanda_item_id( $pagamento_lancamento_vm->getComandaItemId() )
			->setExtornado( $pagamento_lancamento_vm->getExtornado() )
			->setCriado_por( $pagamento_lancamento_vm->getCriado_por() )
			->setData_criacao( DateUtils::today() )
			->setHora_criacao( DateUtils::now_time() )
			->build();

	}

	public static function getComandaPagamentoFromPagamentoComandaPagamentoRegistrationVM(PagamentoComandaPagamentoViewModel $pagamento_pagamento_vm): ComandaPagamento {

		return ComandaPagamento::builder()->setComanda_fechamento_id( $pagamento_pagamento_vm->getComandaFechamentoId() )
			->setForma_pagamento_id( $pagamento_pagamento_vm->getFormaPagamentoId() )
			->setValor( $pagamento_pagamento_vm->getValor() )
			->setDbtcrd( $pagamento_pagamento_vm->getDbtcrd() )
			->setCodauth( $pagamento_pagamento_vm->getCodauth() )
			->setMaquineta( $pagamento_pagamento_vm->getMaquineta() )
			->setBandeira( $pagamento_pagamento_vm->getBandeira() )
			->setDinheiro( $pagamento_pagamento_vm->getDinheiro() )
			->setCreditoCliente( $pagamento_pagamento_vm->getCreditoCliente() ?? [ ])
			->setTroco( $pagamento_pagamento_vm->getTroco() )
			->setChavepix( $pagamento_pagamento_vm->getChavePix() )
			->setObservacao( $pagamento_pagamento_vm->getObservacao() )
			->setCriado_por( $pagamento_pagamento_vm->getCriado_por() )
			->setData_criacao( DateUtils::today() )
			->setHora_criacao( DateUtils::now_time() )
			->build();

	}

}