<?php 
namespace App\Mappers;


use App\Entities\Pet\Pet;
use App\Entities\PetCliente\PetCliente;
use App\Utils\Collections\GeneralCollection;
use App\ViewModels\Pet\PetDetailsViewModel\PetDetailsViewModel;
use App\ViewModels\Pet\PetRegistrationViewModel\PetRegistrationViewModel;
use App\ViewModels\Pet\PetUpdateViewModel\PetUpdateViewModel;
//use const False\MyClass\true;

class PetMapper
{
    public static function getPetDetailsVMListFromArray (array $pet_list) : GeneralCollection {
        $pet_details_vm_collection = new GeneralCollection();
        for ($i = 0, $number_administrativos = count($pet_list); $i < $number_administrativos; $i++) {
            $pet_details_vm_collection->push(
                PetMapper::getPetListVMFromArray($pet_list[$i])
            );
        }
        return $pet_details_vm_collection;
    }

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

    public static function getPetListVMFromArray (array $pet) : PetDetailsViewModel {

        $pet_details_vm = PetDetailsViewModel::builder()
            ->setIdPet($pet['id_pet'])
            ->setDataNascimento($pet['data_nascimento'])
            ->setCor($pet['cor'])
            ->setSexo($pet['sexo'])
            ->setCastrado($pet['castrado'])
            ->setNumeroChip($pet['numero_chip'])
            ->setRgaPedigree($pet['rga_pedigree'])
            ->setDoado($pet['doado'])
            ->setIdRaca($pet['id_raca'])
            ->setNomeRaca($pet['nome_raca'])
            ->setIdEspecie($pet['id_especie'])
            ->setNomeEspecie($pet['nome_especie'])
            ->setIdCliente($pet['id_cliente'])
            ->setNome($pet['nome'])
            ->setNomePet($pet['nome_pet'])
            ->setPorte($pet['porte'])
            ->setObservacoes($pet['observacoes'])
            ->setCpf($pet['cpf'])
            ->setIdPaciente($pet['id_paciente'])
            ->build();
        return $pet_details_vm;
    }

    public static function getPetDetailsVMFromArray (array $pet) : PetDetailsViewModel {

        if(file_exists($pet['foto']) === true) {
            $get_file = file_get_contents($pet['foto']);
            $ext = pathinfo($pet['foto'], PATHINFO_EXTENSION);
            $filebase64 = base64_encode($get_file);

        }else{
            $get_file = file_get_contents("../writable/perfil/default.png");
            $ext = "png";
            $filebase64 = base64_encode($get_file);
        }

        $pet_details_vm = PetDetailsViewModel::builder()
            ->setIdPet($pet['id_pet'])
            ->setDataNascimento($pet['data_nascimento'])
            ->setCor($pet['cor'])
            ->setSexo($pet['sexo'])
            ->setCastrado($pet['castrado'])
            ->setNumeroChip($pet['numero_chip'])
            ->setRgaPedigree($pet['rga_pedigree'])
            ->setDoado($pet['doado'])
            ->setIdRaca($pet['id_raca'])
            ->setNomeRaca($pet['nome_raca'])
            ->setIdEspecie($pet['id_especie'])
            ->setNomeEspecie($pet['nome_especie'])
            ->setIdCliente($pet['id_cliente'])
            ->setNome($pet['nome'])
            ->setCpf($pet['cpf'])
            ->setNomePet($pet['nome_pet'])
            ->setPorte($pet['porte'])
            ->setObservacoes($pet['observacoes'])
            ->setPeso($pet['peso'])
            ->build();
        return $pet_details_vm;
    }



    // REGISTRANDO PET

    public static function PetRegistrationViewModelMapper (array $pet) : PetRegistrationViewModel {
        //$jwt_payload = JWTService::getTokenJWTPayload();
        //$uid = $jwt_payload ? $jwt_payload->getUid() : null;
        $pet_registration_vm = PetRegistrationViewModel::builder()
            ->setNome(ucwords($pet['nome']))
            ->setFoto($pet['foto'])
            ->setDataNascimento($pet['data_nascimento'])
            ->setIdRaca($pet['id_raca'])
            ->setCor($pet['cor'])
            ->setIdPetStatus($pet['id_pet_status'])
            ->setSexo($pet['sexo'])
            ->setCastrado($pet['castrado'])
            ->setNumeroChip($pet['numero_chip'])
            ->setRgaPedigree($pet['rga_pedigree'])
            ->setDoado($pet['doado'] ?? '')
            ->setIdCliente($pet['id_cliente'])
            ->setObservacoes($pet['observacoes'] ?? '')
            ->setNome(ucwords($pet['nome']))
            ->setPorte($pet['porte'])
            ->setPeso($pet['peso'] ?? 0)
            ->build();
        return $pet_registration_vm;
    }


    public static function getPetFromPetRegistrationVM(PetRegistrationViewModel $pet_registration_vm) : Pet{
        $pet = Pet::builder()
            ->setDataNascimento($pet_registration_vm->getDataNascimento())
            ->setIdRaca($pet_registration_vm->getIdRaca())
            ->setCor($pet_registration_vm->getCor())
            ->setIdPetStatus($pet_registration_vm->getIdPetStatus())
            ->setSexo($pet_registration_vm->getSexo())
            ->setCastrado($pet_registration_vm->getCastrado())
            ->setNumeroChip($pet_registration_vm->getNumeroChip())
            ->setRgaPedigree($pet_registration_vm->getRgaPedigree())
            ->setDoado($pet_registration_vm->getDoado())
            ->setNome($pet_registration_vm->getNome())
            ->setPorte($pet_registration_vm->getPorte())
            ->setObservacoes($pet_registration_vm->getObservacoes())
            ->setPeso($pet_registration_vm->getPeso())
            ->build();
        return $pet;
    }

    public static function getPetClienteFromPetRegistrationVM(PetRegistrationViewModel $pet_registration_vm, Pet $pet) : PetCliente {
        $pet_cliente = PetCliente::builder()
            ->setIdPet($pet->getId())
            ->setIdCliente($pet_registration_vm->getIdCliente())
            ->build();
        return $pet_cliente;
    }



    // EDITANDO PET

    public static function getPetUpdateVMFromArray (array $pet_data) : PetUpdateViewModel {
        $pet_update_vm = new PetUpdateViewModel();
        if (isset($pet_data['data_nascimento'])) {
            $pet_update_vm->setDataNascimento($pet_data['data_nascimento']);
        }
        if (isset($pet_data['id_raca'])) {
            $pet_update_vm->setIdRaca($pet_data['id_raca']);
        }
        if (isset($pet_data['cor'])) {
            $pet_update_vm->setCor($pet_data['cor']);
        }
        if (isset($pet_data['id_pet_status'])) {
            $pet_update_vm->setIdPetStatus($pet_data['id_pet_status']);
        }
        if (isset($pet_data['sexo'])) {
            $pet_update_vm->setSexo($pet_data['sexo']);
        }
        if (isset($pet_data['castrado'])) {
            $pet_update_vm->setCastrado($pet_data['castrado']);
        }
        if (isset($pet_data['numero_chip'])) {
            $pet_update_vm->setNumeroChip($pet_data['numero_chip']);
        }
        if (isset($pet_data['rga_pedigree'])) {
            $pet_update_vm->setRgaPedigree($pet_data['rga_pedigree']);
        }
        if (isset($pet_data['doado'])) {
            $pet_update_vm->setDoado($pet_data['doado']);
        }
        if (isset($pet_data['id_cliente'])) {
            $pet_update_vm->setIdCliente($pet_data['id_cliente']);
        }
        if (isset($pet_data['nome'])) {
            $pet_update_vm->setNome(ucwords($pet_data['nome']));
        }
        if (isset($pet_data['porte'])) {
            $pet_update_vm->setPorte($pet_data['porte']);
        }
        if (isset($pet_data['peso'])) {
            $pet_update_vm->setPeso($pet_data['peso']);
        }
        if (isset($pet_data['observacoes'])) {
            $pet_update_vm->setObservacoes($pet_data['observacoes']);
        }
        if (isset($_FILES['foto'])) {
            $ext = "." . pathinfo($_FILES['foto']['name'], PATHINFO_EXTENSION);
            //$ext = strtolower(substr($_FILES['foto']['name'], -4)); //Pegando extensão do arquivo
            $new_name = date("Y.m.d-H.i.s") . $ext; //Definindo um novo nome para o arquivo
            $dir = '../writable/perfil/';
            move_uploaded_file($_FILES['foto']['tmp_name'], $dir.$new_name); //Fazer upload do arquivo
            $pet_data['foto'] = $dir.$new_name;
        }

        if (isset($pet_data['foto'])) {
            $pet_update_vm->setFoto($pet_data['foto']);
        }

        return $pet_update_vm;
    }

    public static function getPetFromPetUpdateVM (PetUpdateViewModel $pet_update_vm) : Pet {
        $pet = new Pet;
        if ($pet_update_vm->getDataNascimento()) {
            $pet->setDataNascimento($pet_update_vm->getDataNascimento());
        }
        if ($pet_update_vm->getIdRaca()) {
            $pet->setIdRaca($pet_update_vm->getIdRaca());
        }
        if ($pet_update_vm->getCor()) {
            $pet->setCor($pet_update_vm->getCor());
        }
        if ($pet_update_vm->getIdPetStatus()) {
            $pet->setIdPetStatus($pet_update_vm->getIdPetStatus());
        }
        if ($pet_update_vm->getSexo()) {
            $pet->setSexo($pet_update_vm->getSexo());
        }
        if ($pet_update_vm->getCastrado()) {
            $pet->setCastrado($pet_update_vm->getCastrado());
        }
        if ($pet_update_vm->getNumeroChip()) {
            $pet->setNumeroChip($pet_update_vm->getNumeroChip());
        }
        if ($pet_update_vm->getRgaPedigree()) {
            $pet->setRgaPedigree($pet_update_vm->getRgaPedigree());
        }
        if ($pet_update_vm->getDoado()) {
            $pet->setDoado($pet_update_vm->getDoado());
        }
        if ($pet_update_vm->getNome()) {
            $pet->setNome($pet_update_vm->getNome());
        }
        if ($pet_update_vm->getPorte()) {
            $pet->setPorte($pet_update_vm->getPorte());
        }
        if ($pet_update_vm->getObservacoes()) {
            $pet->setObservacoes($pet_update_vm->getObservacoes());
        }
        if ($pet_update_vm->getPeso()) {
            $pet->setPeso($pet_update_vm->getPeso());
        }
        //if ($pet_update_vm->getFoto()) {
        //    $pet->setFoto($pet_update_vm->getFoto());
        //}
        return $pet;
    }


}