<?php
/*
 * Copyright (c) 2013, webvariants GbR, http://www.webvariants.de
 *
 * This file is released under the terms of the MIT license. You can find the
 * complete text in the attached LICENSE file or online at:
 *
 * http://www.opensource.org/licenses/mit-license.php
 */

/**
 * Serialisierungsmethoden
 *
 * @ingroup system
 */
class _WV2_Serializer extends WV_Object {
	/**
	 * Artikel-Metadaten speichern
	 *
	 * Diese Funktion speichert die Metainformationen für einen
	 * Artikel, nachdem das Formular abgeschickt wurde.
	 */
	public static function processArticleFrontendForm($isSlicePage, $articleID) {
		$artType   = sly_Util_Article::findById($articleID)->getType();
		$metainfos = WV2_MetaProvider::getAllArticleMetaInfos(!$isSlicePage, $artType);
		$params    = array('article_id' => $articleID, 'slice_page' => $isSlicePage);

		return self::parseFormAndStoreData($articleID, WV2_Metainfo::TYPE_ARTICLE, $metainfos, 'ARTICLE', $params);
	}

	/**
	 * Kategorie-Metadaten speichern
	 *
	 * Diese Funktion speichert die Metainformationen für eine
	 * Kategorie, nachdem das Formular abgeschickt wurde.
	 */
	public static function processCategoryFrontendForm($categoryID) {
		$metainfos = WV2_MetaProvider::getAllCategoryMetaInfos();
		$params    = array('category_id' => $categoryID);

		return self::parseFormAndStoreData($categoryID, WV2_Metainfo::TYPE_CATEGORY, $metainfos, 'CATEGORY', $params);
	}

	/**
	 * Medium-Metadaten speichern
	 *
	 * Diese Funktion speichert die Metainformationen für ein
	 * Medium, nachdem das Formular abgeschickt wurde.
	 */
	public static function processMediumFrontendForm($fileID) {
		$metainfos = WV2_MetaProvider::getAllMediumMetaInfos();
		$params    = array('file_id' => $fileID);

		return self::parseFormAndStoreData($fileID, WV2_Metainfo::TYPE_MEDIUM, $metainfos, 'MEDIUM', $params);
	}

	/**
	 * Benutzer-Metadaten speichern
	 *
	 * Diese Funktion speichert die Metainformationen für ein
	 * Benutzer, nachdem das Formular abgeschickt wurde.
	 */
	public static function processUserFrontendForm($userID) {
		$metainfos = WV2_MetaProvider::getAllUserMetaInfos();
		$params    = array('user_id' => $userID);

		return self::parseFormAndStoreData($userID, WV2_Metainfo::TYPE_USER, $metainfos, 'USER', $params);
	}

	private static function parseFormAndStoreData($object, $type, array $metainfos, $eventName, array $eventParams) {
		$values = array();

		// Metainfos durchgehen und parsen
		foreach ($metainfos as $name => $info) { /* @var $info _WV2_Info */
			if ($info->getBackend()) {
				try {
					$inputFromUser = $info->serializeForm();
					$values[$name] = $inputFromUser;
				}
				catch (WV_Exception_Datatype $e) {
					$errors[$name] = $e->getMessage();
				}
			}
		}

		// Fehler werden im Rohformat zurückgegeben
		if (!empty($errors)) {
			return $errors;
		}

		// Metadaten speichern
		$service = new _WV2_Service_Metadata();
		$clang   = sly_Core::getCurrentClang();

		$service->updateObject($object, $clang, $type, $values);

		// Noch flugs den Cache leeren und wir sind fast fertig.
		WV2_Metainfo::clearDataCache();

		// Event auslösen
		$eventParams['values'] = $values;
		$eventParams['clang']  = WV_Sally::clang();

		sly_Core::dispatcher()->notify('WV2_'.$eventName.'_META_UPDATED', true, $eventParams);

		// Done!
		return true;
	}
}
