<?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
 */

class _WV2_Extensions_Medium extends _WV2_Extensions_Base {
	/**
	 * Handler für SLY_MEDIA_ADDED
	 *
	 * Fügt der neuen Datei alle vorhandenen Metainformationen hinzu.
	 *
	 * @param array $params  die von Sally übergebenen Parameter
	 */
	public static function onMediumAdded(array $params) {
		$metainfos = WV2_MetaProvider::getAllMediumMetaInfos();
		$clangs    = sly_Util_Language::findAll(true);
		$service   = new _WV2_Service_Metadata();

		foreach ($metainfos as $name => $info) {
			$metainfos[$name] = $info->getDefault();
		}

		foreach ($clangs as $clang) {
			$service->insertMediumData($params['subject'], $clang, $metainfos);
		}
	}

	/**
	 * Handler für SLY_MEDIA_SYNCED
	 *
	 * @param array $params  die von Sally übergebenen Parameter
	 */
	public static function onMediumSynced(array $params) {
		self::onMediumAdded($params);
	}

	/**
	 * Handler für MEDIA_FORM_EDIT
	 *
	 * Erzeugt das Frontend-Formular für Medien.
	 *
	 * @param  array $params  die von Sally übergebenen Parameter
	 * @return sly_Form       das Formular
	 */
	public static function onMediumEditForm(array $params) {
		if (!self::canEdit() && !self::canView()) return $params['subject'];

		$form           = $params['subject'];
		$availableInfos = WV2_MetaProvider::getAllMediumMetaInfos();

		if (!empty($availableInfos)) {
			$medium = (int) $params['file_id'];
			$clang  = sly_request('clang', 'int', WV_Sally::clang());

			require _WV2_PATH.'templates/media/meta_frontend.phtml';
		}

		return $form;
	}

	/**
	 * Handler für SLY_MEDIA_UPDATED
	 *
	 * Serialisiert das Frontend-Formular und gibt ihm Fehlerfalle die
	 * Fehlermeldung, sonst das Subject zurück.
	 *
	 * @param array $params  die von Sally übergebenen Parameter
	 */
	public static function onMediumUpdated(array $params) {
		if (!self::canEdit() || !sly_post('wv2metainfo', 'bool', false)) return;

		$fileID = $params['subject']->getId();
		$errors = _WV2_Serializer::processMediumFrontendForm($fileID);

		if (is_array($errors)) {
			self::showErrors($errors, WV2_Metainfo::TYPE_MEDIUM);
		}
	}

	/**
	 * Handler für SLY_MEDIA_DELETED
	 *
	 * Entfernt alle Metadaten für die gelöschte Datei.
	 *
	 * @param array $params  die von Sally übergebenen Parameter
	 */
	public static function onMediumDeleted(array $params) {
		$service = new _WV2_Service_Metadata();
		$service->deleteMedium($params['subject']);

		WV2_Metainfo::clearDataCache();
	}

	/**
	 * Handler für SLY_MEDIA_USAGES
	 *
	 * Prüft, ob eine Datei noch in Benutzung ist. Dazu werden an das
	 * übergebene Subject bei Bedarf weitere Elemente angehängt.
	 */
	public static function onMediaUsages(array $params) {
		$sql = WV_SQL::getInstance();
		$sql->query(
			'SELECT object_id, clang, meta_type FROM '.sly_Core::getTablePrefix().'wv2_meta '.
			'WHERE `value` LIKE '.$sql->quote('%'.$params['filename'].'%').' GROUP BY meta_type, object_id, clang'
		);

		foreach ($sql as $row) {
			$usage = array(
				'id'    => (int) $row['object_id'],
				'clang' => (int) $row['clang']
			);

			$obj = WV2_Metainfo::getObject($row['object_id'], $row['clang'], $row['meta_type']);

			switch ($row['meta_type']) {
				case WV2_Metainfo::TYPE_ARTICLE:
					$usage['title'] = $obj->getName();
					$usage['link']  = 'index.php?page=content&article_id='.$row['object_id'].'&clang='.$row['clang'];
					$usage['type']  = 'sly-article';
					break;

				case WV2_Metainfo::TYPE_CATEGORY:
					$usage['title'] = $obj->getCatName();
					$usage['link']  = 'index.php?page=structure&category_id='.$row['object_id'].'&clang='.$row['clang'];
					$usage['type']  = 'sly-category';
					break;

				case WV2_Metainfo::TYPE_MEDIUM:
					$usage['title'] = $obj->getTitle();
					$usage['type']  = 'sly-medium';
					break;
			}

			$params['subject'][] = $usage;
		}

		return $params['subject'];
	}
}
