<?php

class Eppe_Db_Table_Row_Abstract extends Zend_Db_Table_Row_Abstract {

	/**
	 * Usuwa element jeśli jest kopią roboczą
	 */
	public function deleteIfDraft() {
		if ($this->isDraft()) {
			$this->delete();
		}
	}

	/**
	 * @return bool Czy wiersz jest kopią roboczą
	 */
	public function isDraft() {
		$tableName = $this->getTable()->info('name');

		$mDrafts = Core_Model_Drafts::_new();
		return (bool) $mDrafts->fetchAll($mDrafts->select()->where('object_id = ?', $this->id)->where('table_name = ?', $tableName))->count();
	}

	/**
	 * Oznacza element jako wstępna kopia robocza
	 */
	public function setDraft() {
		$tableName = $this->getTable()->info('name');

		Core_Model_Drafts::_new()->createRow(array(
			'table_name' => $tableName,
			'object_id' => $this->id
		))->save();
	}

	/**
	 * Odznacza element jako wstępna kopia robocza
	 */
	public function unsetDraft() {
		$tableName = $this->getTable()->info('name');

		$mDrafts = Core_Model_Drafts::_new();
		$row = $mDrafts->fetchRow($mDrafts->select()->where('object_id = ?', $this->id)->where('table_name = ?', $tableName));
		if ($row != null)
			$row->delete();
	}

	/**
	 * Zwraca tylko te kolumny, których klucze znajdują się w przekazanej tablicy
	 * @param array $array Tablica z kluczami (klucze jako klucze)
	 * @return array
	 */
	public function toArrayByArrayKeys($array) {
		$tmp = $this->toArray();
		foreach (array_keys($array) as $k) {
			$array[$k] = $tmp[$k];
		}

		return $array;
	}

	/**
	 * @return array Tablica przetłumaczonych przyczyn dla których element nie może stać się aktywny
	 */
	public function whyCantBecomeActive() {
		return array();
	}

	/**
	 * @return array Tablica przetłumaczonych przyczyn dla których element nie może przestać być aktywny
	 */
	public function whyCantBecomeInactive() {
		return array();
	}

	/**
	 * @return boolean Czy element jest aktywny
	 */
	public function isActive() {
		return (bool) $this->active;
	}

	/**
	 * Zmień status elementu na aktywny
	 * @return boolean Czy elemen stał się aktywny
	 */
	public function makeActive() {
		$this->active = true;
		return (bool) $this->save();
	}

	/**
	 * Zmień status elementu na nieaktywny
	 * @return boolean Czy elemen stał się nieaktywny
	 */
	public function makeInactive() {
		$this->active = false;
		return (bool) $this->save();
	}

	public function isClonedToLangCode($langCode) {
		$rowClass = $this->getTable();
		$row = $rowClass::getRow($this->id, $langCode);

		return !empty($row);
	}

	public function cloneToLangCode($langCode) {
		$rowArray = $this->toArray();
		$rowArray['lang_code'] = $langCode;
		$rowArray['active'] = false;
		$this->getTable()->createRow($rowArray)->save();
	}

	public function columnsAmount() {
		return isset($this->columns) ? $this->columns : 1;
	}

	public function canDropNew() {
		return isset($this->can_drop_new) ? $this->can_drop_new : 1;
	}

	public function allowedActions() {
		return isset($this->allowed_actions) ? $this->allowed_actions : json_encode(array('m', 'c', 'u', 'd'));
	}

	public function deserializeToRowColumns($columnName) {
		if (!$this->$columnName)
			return null;

		$this->deserializeColumn($columnName);
		$this->arrayToRowColumns($this->$columnName);
	}

	public function deserializeColumn($columnName) {
		$this->$columnName = unserialize($this->$columnName);
	}

	public function arrayToRowColumns($array) {
		foreach ($array as $key => $value) {
			$this->_data[$key] = $value;
		}
	}

	public function setActivatedDate() {
		if ($this->isDraft()) {
			$this->activated = date('Y-m-d H:i:s');
		}
	}

	public function setExpirationDate() {
		if ($this->active) {
			$dateTime = new DateTime($this->activated);
			$dateTime->add(new DateInterval('P30D'));
			$this->_data['expiration_date'] = $dateTime->format('Y-m-d H:i:s');
		} else {
			$this->_data['expiration_date'] = __('niedostępna');
		}
	}

	public function setHasExpired() {
		$this->_data['has_expired'] = $this->hasExpired();
	}

	public function hasExpired() {
		if ($this->activated) {
			$dateTime = new DateTime($this->activated);
			$dateTime->add(new DateInterval('P30D'));
			if ($dateTime->getTimestamp() > date('U')) {
				return 0;
			}
		}
		return 1;
	}

	/**
	 * @return string Dekodowanie bloków zapisanych w postaci json
	 */
	public function getDecodedBlocks() {
		return json_decode($this->blocks);
	}

	/**
	 * Renderowanie dtrony z bloków
	 */
	public function renderBlocks() {
		$blocks = '';
		foreach ($this->getDecodedBlocks() as $block) {
			$className = 'Core_Class_Block_' . ucfirst($block->{0});
			$blockClass = new $className($block->{1});
			$blocks .= $blockClass->renderFrontend();
			$blocks .= '<div class="clear"></div>';
		}

		return $blocks;
	}

}
