<?php

// No direct access

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\Registry\Registry;

/**
 * Модель редактирования текущего элемента
 * @author platonische
 */
class FokserviceModelRoom extends JModelAdmin
{

	/**
	 * загрузка текущей формы
	 *
	 * @param   Array    $data
	 * @param   Boolean  $loadData
	 *
	 * @return Object form data
	 */
	public function getForm($data = array(), $loadData = true)
	{
		$form = $this->loadForm('com_fokservice.room', 'room', array('control' => 'jform', 'load_data' => $loadData));
		if (empty($form))
		{
			return false;
		}

		$form->loadFile('roomfields');

		$user = JFactory::getUser();
		if (!$user->authorise('fs_room.edit.state', 'com_fokservice.room.' . $this->getState('extdataedit.id')))
		{
			$form->setFieldAttribute('published', 'disabled', 'true');
			$form->setFieldAttribute('published', 'filter', 'unset');
		}

		return $form;
	}

	/**
	 * @param   Int  $id  (object identifier)
	 *
	 * @return Object (current item)
	 */
	public function getItem($id = null)
	{
		if ($item = parent::getItem($id))
		{
			$item->text = trim($item->fulltext) != '' ? $item->introtext . '<hr id="system-readmore" />' . $item->fulltext : $item->introtext;
		}

		return $item;
	}

	/**
	 * @param   string  $type
	 * @param   string  $prefix
	 * @param   array   $config
	 *
	 * @return JTable|mixed
	 */
	public function getTable($type = 'fs_rooms', $prefix = 'Table', $config = array())
	{
		return JTable::getInstance($type, $prefix, $config);
	}

	/**
	 * Загрузка данных в форму
	 * @return Object
	 */
	protected function loadFormData()
	{
		$data = JFactory::getApplication()->getUserState('com_fokservice.edit.room.data', array());
		if (empty($data))
		{
			$data = $this->getItem();
		}

		return $data;
	}

	/**
	 * Запрет удаления записи
	 *
	 * @param   object  $record
	 *
	 * @return bool
	 */
	protected function canDelete($record)
	{
		if (!empty($record->id))
		{
			return JFactory::getUser()->authorise('fs_room.delete', 'com_fokservice.room.' . (int) $record->id);
		}
	}

	/**
	 * Запрет изменения состояния
	 *
	 * @param   object  $record
	 *
	 * @return bool
	 */
	protected function canEditState($record)
	{
		$user = JFactory::getUser();

		// Check for existing article.
		if (!empty($record->id))
		{
			return $user->authorise('fs_room.edit.state', 'com_fokservice.room.' . (int) $record->id);
		} // Default to component settings if neither article nor category known.
		else
		{
			return parent::canEditState('com_fokservice');
		}
	}


	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @throws  Exception
	 *
	 * @return  int|false  Item id on success, False on failure.
	 *
	 * @since  __DEPLOY_VERSION__
	 */
	public function save($data)
	{
		$pk    = (!empty($data['id'])) ? $data['id'] : (int) $this->getState($this->getName() . '.id');
		$table = $this->getTable();
		$isNew = true;
		$now   = Factory::getDate()->toSql();

		// Load the row if saving an existing item
		if ($pk > 0)
		{
			$table->load($pk);
			$isNew = false;
		}

		// Prepare modified fields data
		$data['modified']    = $now;
		$data['modified_by'] = (int) Factory::getUser()->id;

		if (parent::save($data))
		{
			$id = $this->getState($this->getName() . '.id');
			if (empty($id)) $id = $table->id;
			$data['id'] = $id;

			// Save logs
			/* @var FokServiceModelLog $logModel */
			$logModel = parent::getInstance('Log', 'FokServiceModel', array('ignore_request' => true));
			$table    = 'fs_rooms';
			$result   = $logModel->save(
				array(
					'table_name'  => $table,
					'table_id'    => $id,
					'record_type' => ($isNew) ? 'INSERT' : 'UPDATE',
					'log_data'    => (new Registry($data))->toString('json', array('bitmask' => JSON_UNESCAPED_UNICODE)),
					'title'       => $table . ' ' . $now,
					'alias'       => $now,
				)
			);
			if ($result === false && !empty($logModel->getErrors()))
			{
				$message = array();
				foreach ($logModel->getErrors() as $error)
				{
					$message[] = ($error instanceof Exception) ? $error->getMessage() : $error;
				}
				Factory::getApplication()->enqueueMessage(implode('<br>', $message), 'warning');
			}

			return $id;
		}

		return false;
	}
}