<?php namespace App\Mappers;

use App\Entities\CEP\CEP;
use App\Entities\Endereco\Endereco;
use App\Entities\Perfil\Perfil;
use App\Entities\Permissao\Permissao;
use App\Entities\Pessoa\Pessoa;
use App\Entities\PessoaJuridica\PessoaJuridica;
use App\Services\JWTService;
use App\Utils\Collections\GeneralCollection;
use App\ViewModels\Perfil\PerfilDetailsViewModel\PerfilDetailsViewModel;
use App\ViewModels\Perfil\PerfilDetailsViewModel\PerfilResponseDatabaseDetailsViewModel;
use App\ViewModels\Perfil\PerfilDetailsViewModel\PermissaoDetails;
use App\ViewModels\Perfil\PerfilDetailsViewModel\PermissaoDetailsCollection;
use App\ViewModels\Perfil\PerfilListingViewModel\PerfilListingViewModel;
use App\ViewModels\Perfil\PerfilRegistrationViewModel\PerfilRegistrationViewModel;
use App\ViewModels\Perfil\PerfilUpdateViewModel\PerfilUpdateViewModel;

class PerfilMapper
{

    // MAPEAMENTO PARA LISTAGEM DE PERFIL

    public static function getPerfilVMListFromArray (array $perfil_list) : GeneralCollection {
        $perfil_details_vm_collection = new GeneralCollection();
        for ($i = 0, $number_perfils = count($perfil_list); $i < $number_perfils; $i++) {
            $perfil_details_vm_collection->push(
                PerfilMapper::getPerfilVMFromListArray($perfil_list[$i])
            );
        }
        return $perfil_details_vm_collection;
    }

    public static function getPerfilVMFromListArray (array $perfil) : PerfilListingViewModel {
        $perfil_details_vm = PerfilListingViewModel::builder()
            ->setPerfilId($perfil['perfil_id'])
            ->setPerfilNome($perfil['perfil_nome'])
            ->build();
        return $perfil_details_vm;
    }


    // MAPEAMENTO PARA DETALHES DE PERFIL

    public static function getPerfilDetailsVMFromArray (array $response_array): PerfilDetailsViewModel {
        $perfil_details_vm = new PerfilDetailsViewModel();
        $perfil_details_response_db_collection = (new GeneralCollection($response_array))->map(function (array $row): PerfilResponseDatabaseDetailsViewModel {
            return PerfilResponseDatabaseDetailsViewModel::builder()
                ->setPerfilId($row['perfil_id'])
                ->setPerfilNome($row['perfil_nome'])
                ->setPermissaoId($row['permissao_id'])
                ->setAtivo($row['ativo'])
                ->setEndpointId($row['endpoint_id'])
                ->setEndpointAction($row['endpoint_action'] ?? [])
                ->setEndpointController($row['endpoint_controller'])
                ->setEndpointMethod($row['endpoint_method'])
                ->setEndpointPath($row['endpoint_path'])
                ->build();
        });

        $first_row = (function (PerfilResponseDatabaseDetailsViewModel $perfil_details_response_db): PerfilResponseDatabaseDetailsViewModel {
            return $perfil_details_response_db;
        })($perfil_details_response_db_collection->get(0));
        $perfil_details_vm->setPerfilId($first_row->getPerfilId());
        $perfil_details_vm->setPerfilNome($first_row->getPerfilNome());

        $permissao_details_collection = new PermissaoDetailsCollection();
        $perfil_details_response_db_collection->forEach(function (PerfilResponseDatabaseDetailsViewModel $perfil_details_response_db) use ($permissao_details_collection): void {
            $permissao_details = PermissaoDetails::builder()
                ->setPermissaoId($perfil_details_response_db->getPermissaoId())
                ->setAtivo($perfil_details_response_db->getAtivo())
                ->setEndpointAction($perfil_details_response_db->getEndpointAction())
                ->setEndpointController($perfil_details_response_db->getEndpointController())
                ->setEndpointMethod($perfil_details_response_db->getEndpointMethod())
                ->setEndpointId($perfil_details_response_db->getEndpointId())
                ->setEndpointPath($perfil_details_response_db->getEndpointPath())
                ->build();
            $permissao_details_collection->push($permissao_details);
        });
        $perfil_details_vm->setPermissoes($permissao_details_collection);

        return $perfil_details_vm;
    }

    //

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


    // MAPEAMENTO PARA REGISTRO DE PERFIL
        // MAPEANDO OBJETO DE ENTRADA
    public static function PerfilRegistrationViewModelMapper (array $perfil) : PerfilRegistrationViewModel {
        $perfil_registration_vm = PerfilRegistrationViewModel::builder()
            ->setDescricao($perfil['descricao'])
            ->setPermissao($perfil['permissao'])
            ->build();
        return $perfil_registration_vm;
    }

        // MAPEANDO OBJETO DE PERSISTÊNCIA
    public static function getPerfilFromPerfilRegistrationVM (PerfilRegistrationViewModel $perfil_registration_vm) : Perfil {
        $perfil = Perfil::builder()
            ->setDescricao($perfil_registration_vm->getDescricao())
            ->build();
        return $perfil;
    }

    public static function getPermissaoFromPerfilRegistrationVM (Perfil $perfil, $id_endpoint, $descricao) : Permissao {
        $permissao = Permissao::builder()
            ->setDescricao($descricao)
            ->setIdEndpoint($id_endpoint)
            ->setIdPerfil($perfil->getId())
            ->setAtivo(0)
            ->build();
        return $permissao;
    }



    //  MAPEAMENTO PARA EDIÇÃO DE PERFIL

    public static function getPerfilUpdateVMFromArray (array $perfil_data) : PerfilUpdateViewModel {
        $perfil_update_vm = new PerfilUpdateViewModel();
        if (isset($perfil_data['descricao'])) {
            $perfil_update_vm->setDescricao($perfil_data['descricao']);
        }
        if (isset($perfil_data['permissao'])) {
            $perfil_update_vm->setPermissao($perfil_data['permissao']);
        }
        return $perfil_update_vm;
    }

    public static function getPerfilFromPerfilUpdateVM (PerfilUpdateViewModel $perfil_update_vm) : Perfil {
        $perfil = new Perfil();
        if ($perfil_update_vm->getDescricao()) {
            $perfil->setDescricao($perfil_update_vm->getDescricao());
        }
        return $perfil;
    }

    public static function getPermissaoFromPerfilUpdateVM (PerfilUpdateViewModel $perfil_update_vm) : Permissao {
        $permissao = new Permissao();
        if ($perfil_update_vm->getPermissao()) {
            $permissao->setIdPermissao($perfil_update_vm->getPermissao());
        }
        return $permissao;
    }



}