<?php namespace App\Mappers;

use App\Entities\CEP\CEP;
use App\Entities\Endereco\Endereco;
use App\Entities\Pessoa\Pessoa;
use App\Entities\PessoaJuridica\PessoaJuridica;
use App\Entities\Unidade\Unidade;
use App\Services\JWTService;
use App\Utils\Collections\GeneralCollection;
use App\ViewModels\Unidade\UnidadeDetailsViewModel\UnidadeDetailsViewModel;
use App\ViewModels\Unidade\UnidadeRegistrationViewModel\UnidadeRegistrationViewModel;
use App\ViewModels\Unidade\UnidadeUpdateViewModel\UnidadeUpdateViewModel;

class UnidadeMapper
{
    public static function getUnidadeDetailsVMFromArray (array $unidade) : UnidadeDetailsViewModel {
        return UnidadeDetailsViewModel::builder()
            ->setPessoaJuridicaId($unidade['pessoa_juridica_id'] ?? 0)
            ->setNomeFantasia($unidade['nome_fantasia'] ?? '-')
            ->setRazaoSocial($unidade['razao_social'] ?? '-')
            ->setCnpj($unidade['cnpj'] ?? '-')
            ->setPessoaId($unidade['pessoa_id'])
            ->setTelefone1($unidade['telefone_1'])
            ->setTelefone2($unidade['telefone_2'])
            ->setObservacao($unidade['observacao'])
            ->setEnderecoId($unidade['endereco_id'])
            ->setCep($unidade['cep'])
            ->setNumero($unidade['numero'])
            ->setComplemento($unidade['complemento'])
            ->setReferencias($unidade['referencias'])
            ->setCepId($unidade['cep_id'])
            ->setEstado($unidade['estado'])
            ->setCidade($unidade['cidade'])
            ->setBairro($unidade['bairro'])
            ->setLogradouro($unidade['logradouro'])
            ->setDescricao($unidade['descricao'] ?? '-')
            ->setTelemedicina($unidade['telemedicina'] ?? '-')
            ->setUnidadeId($unidade['unidade_id'] ?? 0)
            ->setAtivo($unidade['ativo'] ?? 0)
            ->build();
    }

    public static function getUnidadeDetailsVMListFromArray (array $unidade_list) : GeneralCollection {
        $unidade_details_vm_collection = new GeneralCollection();
        for ($i = 0, $number_unidades = count($unidade_list); $i < $number_unidades; $i++) {
            $unidade_details_vm_collection->push(
                UnidadeMapper::getUnidadeDetailsVMFromArray($unidade_list[$i])
            );
        }
        return $unidade_details_vm_collection;
    }

    public static function getUnidadeDetailsArrayFromUnidadeDetailsVMList (GeneralCollection $paciente_details_vm_collection) : array {
        return $paciente_details_vm_collection->toArray();
    }


    // MAPEAMENTO PARA REGISTRO DE UNIDADE

    public static function UnidadeRegistrationViewModelMapper (array $unidade) : UnidadeRegistrationViewModel {
        $jwt_payload = JWTService::getTokenJWTPayload();
        $uid = $jwt_payload ? $jwt_payload->getUid() : null;
        $unidade_registration_vm = UnidadeRegistrationViewModel::builder()
            ->setCep($unidade['cep'])
            ->setBairro($unidade['bairro'])
            ->setLogradouro($unidade['logradouro'])
            ->setCidade($unidade['cidade'])
            ->setEstado($unidade['estado'])
            ->setNumero($unidade['numero'])
            ->setComplemento($unidade['complemento'])
            ->setReferencias($unidade['referencias'])
            ->setTelefone1($unidade['telefone_1'])
            ->setTelefone2($unidade['telefone_2'])
            ->setObservacao($unidade['observacao'])
            ->setNomeFantasia($unidade['nome_fantasia'])
            ->setRazaoSocial($unidade['razao_social'])
            ->setCnpj($unidade['cnpj'])
            ->setDescricao($unidade['descricao']?? $unidade['nome_fantasia'])
            ->setTelemedicina($unidade['telemedicina'] ?? 0)
            ->setAdicionadoPor($uid)
            ->build();
        return $unidade_registration_vm;
    }

    public static function getCepFromUnidadeRegistrationVM (UnidadeRegistrationViewModel $unidade_registration_vm) : CEP {
        $endereco = CEP::builder()
            ->setCep($unidade_registration_vm->getCep())
            ->setEstado($unidade_registration_vm->getEstado())
            ->setBairro($unidade_registration_vm->getBairro())
            ->setCidade($unidade_registration_vm->getCidade())
            ->setLogradouro($unidade_registration_vm->getLogradouro())
            ->build();
        return $endereco;
    }

    public static function getEnderecoFromUnidadeRegistrationVM (UnidadeRegistrationViewModel $unidade_registration_vm, CEP $cep) : Endereco {
        $endereco = Endereco::builder()
            ->setCep($cep->getId())
            ->setNumero($unidade_registration_vm->getNumero())
            ->setComplemento($unidade_registration_vm->getComplemento())
            ->setReferencias($unidade_registration_vm->getReferencias())
            ->build();
        return $endereco;
    }

    public static function getPessoaFromUnidadeRegistrationVM (UnidadeRegistrationViewModel $unidade_registration_vm, Endereco $endereco) : Pessoa {
        $pessoa = Pessoa::builder()
            ->setTelefone1($unidade_registration_vm->getTelefone1())
            ->setTelefone2($unidade_registration_vm->getTelefone2())
            ->setIdEndereco($endereco->getId())
            ->setIdTipoPessoa(PESSOA_JURIDICA_ID)
            ->setAdicionadoPor($unidade_registration_vm->getAdicionadoPor())
            ->build();
        return $pessoa;
    }

    public static function getPessoaJuridicaFromUnidadeRegistrationVM (UnidadeRegistrationViewModel $unidade_registration_vm, Pessoa $pessoa) : PessoaJuridica {
        $pessoa_fisica = PessoaJuridica::builder()
            ->setIdPessoa($pessoa->getId())
            ->setNomeFantasia($unidade_registration_vm->getNomeFantasia())
            ->setRazaoSocial($unidade_registration_vm->getRazaoSocial())
            ->setCnpj($unidade_registration_vm->getCnpj())
            ->build();
        return $pessoa_fisica;
    }

    public static function getUnidadeFromUnidadeRegistrationVM (UnidadeRegistrationViewModel $unidade_registration_vm, PessoaJuridica $pessoa) : Unidade {
        $pessoa_fisica = Unidade::builder()
            ->setIdPessoaJuridica($pessoa->getId())
            ->setDescricao($unidade_registration_vm->getDescricao())
            ->setTelemedicina($unidade_registration_vm->getTelemedicina())
            ->setIdChamefacilServer(1)
            ->build();
        return $pessoa_fisica;
    }


    //  EDIÇÃO DE UNIDADE

    public static function getUnidadeUpdateVMFromArray (array $unidade_data) : UnidadeUpdateViewModel {
        $unidade_update_vm = new UnidadeUpdateViewModel();
        if (isset($unidade_data['cep'])) {
            $unidade_update_vm->setCep($unidade_data['cep']);
        }
        if (isset($unidade_data['bairro'])) {
            $unidade_update_vm->setBairro($unidade_data['bairro']);
        }
        if (isset($unidade_data['logradouro'])) {
            $unidade_update_vm->setLogradouro($unidade_data['logradouro']);
        }
        if (isset($unidade_data['cidade'])) {
            $unidade_update_vm->setCidade($unidade_data['cidade']);
        }
        if (isset($unidade_data['estado'])) {
            $unidade_update_vm->setEstado($unidade_data['estado']);
        }
        if (isset($unidade_data['numero'])) {
            $unidade_update_vm->setNumero($unidade_data['numero']);
        }
        if (isset($unidade_data['complemento'])) {
            $unidade_update_vm->setComplemento($unidade_data['complemento']);
        }
        if (isset($unidade_data['referencias'])) {
            $unidade_update_vm->setReferencias($unidade_data['referencias']);
        }
        if (isset($unidade_data['telefone_1'])) {
            $unidade_update_vm->setTelefone1($unidade_data['telefone_1']);
        }
        if (isset($unidade_data['telefone_2'])) {
            $unidade_update_vm->setTelefone2($unidade_data['telefone_2']);
        }
        if (isset($unidade_data['observacao'])) {
            $unidade_update_vm->setObservacao($unidade_data['observacao']);
        }
        if (isset($unidade_data['nome_fantasia'])) {
            $unidade_update_vm->setNomeFantasia($unidade_data['nome_fantasia']);
        }
        if (isset($unidade_data['razao_social'])) {
            $unidade_update_vm->setRazaoSocial($unidade_data['razao_social']);
        }
        if (isset($unidade_data['cnpj'])) {
            $unidade_update_vm->setCnpj($unidade_data['cnpj']);
        }
        if (isset($unidade_data['descricao'])) {
            $unidade_update_vm->setDescricao($unidade_data['descricao']);
        }
        if (isset($unidade_data['telemedicina'])) {
            $unidade_update_vm->setTelemedicina($unidade_data['telemedicina']);
        }
//        if (isset($unidade_data['id_unidade'])) {
//            $unidade_update_vm->setIdUnidade($unidade_data['id_unidade']);
//        }

        $unidade_update_vm->setAlteradoPor(JWTService::getTokenJWTPayload()->getUid());
        return $unidade_update_vm;
    }

    public static function getCepFromUnidadeUpdateVM (UnidadeUpdateViewModel $unidade_update_vm) : CEP {
        $cep = new CEP();
        if ($unidade_update_vm->getCep()) {
            $cep->setCep($unidade_update_vm->getCep());
        }
        if ($unidade_update_vm->getBairro()) {
            $cep->setBairro($unidade_update_vm->getBairro());
        }
        if ($unidade_update_vm->getLogradouro()) {
            $cep->setLogradouro($unidade_update_vm->getLogradouro());
        }
        if ($unidade_update_vm->getCidade()) {
            $cep->setCidade($unidade_update_vm->getCidade());
        }
        if ($unidade_update_vm->getEstado()) {
            $cep->setEstado($unidade_update_vm->getEstado());
        }
        return $cep;
    }

    public static function getEnderecoFromUnidadeUpdateVM (UnidadeUpdateViewModel $unidade_update_vm) : Endereco {
        $endereco = new Endereco();
        if ($unidade_update_vm->getNumero()) {
            $endereco->setNumero($unidade_update_vm->getNumero());
        }
        if ($unidade_update_vm->getComplemento()) {
            $endereco->setComplemento($unidade_update_vm->getComplemento());
        }
        if ($unidade_update_vm->getReferencias()) {
            $endereco->setReferencias($unidade_update_vm->getReferencias());
        }
        return $endereco;
    }

    public static function getPessoaFromUnidadeUpdateVM (UnidadeUpdateViewModel $unidade_update_vm) : Pessoa {
        $pessoa = new Pessoa();
        if ($unidade_update_vm->getTelefone1()) {
            $pessoa->setTelefone1($unidade_update_vm->getTelefone1());
        }
        if ($unidade_update_vm->getTelefone2()) {
            $pessoa->setTelefone2($unidade_update_vm->getTelefone2());
        }
        if ($unidade_update_vm->getAlteradoPor()) {
            $pessoa->setAlteradoPor($unidade_update_vm->getAlteradoPor());
        }
        return $pessoa;
    }

    public static function getPessoaJuridicaFromUnidadeUpdateVM (UnidadeUpdateViewModel $unidade_update_vm) : PessoaJuridica {
        $pessoa_juridica = new PessoaJuridica;
        if ($unidade_update_vm->getNomeFantasia()) {
            $pessoa_juridica->setNomeFantasia($unidade_update_vm->getNomeFantasia());
        }
        if ($unidade_update_vm->getRazaoSocial()) {
            $pessoa_juridica->setRazaoSocial($unidade_update_vm->getRazaoSocial());
        }
        if ($unidade_update_vm->getCnpj()) {
            $pessoa_juridica->setCnpj($unidade_update_vm->getCnpj());
        }
        return $pessoa_juridica;
    }

    public static function getUnidadeFromUnidadeUpdateVM (UnidadeUpdateViewModel $unidade_update_vm) : Unidade {
        $unidade = new Unidade;
        if ($unidade_update_vm->getDescricao()) {
            $unidade->setDescricao($unidade_update_vm->getDescricao());
        }
        if ($unidade_update_vm->getTelemedicina()) {
            $unidade->setTelemedicina($unidade_update_vm->getTelemedicina());
        }
        return $unidade;
    }


}
