<?php

namespace XF\Service;

use function count, get_class, is_array;

trait ValidateAndSavableTrait
{
	protected $validationComplete = false;
	protected $validationErrors = [];

	abstract protected function _validate();
	abstract protected function _save();

	public function validate(&$errors = [])
	{
		if (!$this->validationComplete)
		{
			$this->validationErrors = $this->_validate();
			if (!is_array($this->validationErrors))
			{
				throw new \LogicException("_validate in " . get_class($this) . " must return an array");
			}
			$this->validationComplete = true;
		}

		$errors = $this->validationErrors;
		return count($errors) == 0;
	}

	public function save()
	{
		if (!$this->validate($errors))
		{
			$error = reset($errors);
			throw new \LogicException(
				"Cannot save with validation errors. Use validate() to ensure there are no errors. "
				. "(First error: $error)"
			);
		}

		return $this->_save();
	}

	public function resetValidation()
	{
		$this->validationComplete = false;
		$this->validationErrors = [];
	}
}
