<?php

/**
 * Encode our data so that it can be serialised
 */
namespace App\Traits;

trait EncodeUTF8
{
	private function decode(array $values): void
	{
		$properties = (new \ReflectionClass($this))->getProperties();

		$class = get_class($this);

		foreach ($properties as $property) {
			if ($property->isStatic()) {
				continue;
			}

			$name = $property->getName();
			$decode = in_array($name,self::cast_utf8);

			if ($property->isPrivate()) {
				$name = "\0{$class}\0{$name}";
			} elseif ($property->isProtected()) {
				$name = "\0*\0{$name}";
			}

			if (! array_key_exists($name,$values)) {
				continue;
			}

			$property->setAccessible(true);

			$property->setValue(
				$this,$decode ? utf8_decode($values[$name]) : $values[$name]
			);
		}
	}

	private function encode(): array
	{
		$values = [];

		$properties = (new \ReflectionClass($this))->getProperties();

		$class = get_class($this);

		foreach ($properties as $property) {
			// Dont serialize the validation error
			if ($property->name == 'errors')
				continue;

			if ($property->isStatic()) {
				continue;
			}

			$property->setAccessible(true);

			if (! $property->isInitialized($this)) {
				continue;
			}

			$name = $property->getName();
			$encode = in_array($name,self::cast_utf8);

			if ($property->isPrivate()) {
				$name = "\0{$class}\0{$name}";
			} elseif ($property->isProtected()) {
				$name = "\0*\0{$name}";
			}

			$property->setAccessible(true);
			$value = $property->getValue($this);

			$values[$name] = $encode ? utf8_encode($value) : $value;
		}

		return $values;
	}
}