<?php

namespace XF\Admin\Controller;

use XF\Mvc\FormAction;
use XF\Mvc\ParameterBag;

class UserGroup extends AbstractController
{
	protected function preDispatchController($action, ParameterBag $params)
	{
		$this->assertAdminPermission('userGroup');
	}

	public function actionIndex()
	{
		$viewParams = [
			'userGroups' => $this->getUserGroupRepo()->findUserGroupsForList()->fetch(),
		];
		return $this->view('XF:UserGroup\Listing', 'user_group_list', $viewParams);
	}

	protected function userGroupAddEdit(\XF\Entity\UserGroup $userGroup)
	{
		$displayStyles = [
			'userBanner userBanner--hidden',
			'userBanner userBanner--primary',
			'userBanner userBanner--accent',
			'userBanner userBanner--red',
			'userBanner userBanner--green',
			'userBanner userBanner--olive',
			'userBanner userBanner--lightGreen',
			'userBanner userBanner--blue',
			'userBanner userBanner--royalBlue',
			'userBanner userBanner--skyBlue',
			'userBanner userBanner--gray',
			'userBanner userBanner--silver',
			'userBanner userBanner--yellow',
			'userBanner userBanner--orange',
		];

		/** @var \XF\Repository\Permission $permissionRepo */
		$permissionRepo = $this->repository('XF:Permission');
		$permissionData = $permissionRepo->getGlobalPermissionListData();

		/** @var \XF\Repository\PermissionEntry $entryRepo */
		$entryRepo = $this->repository('XF:PermissionEntry');
		$permissionData['values'] = $entryRepo->getGlobalUserGroupPermissionEntries($userGroup->user_group_id);

		$viewParams = [
			'userGroup' => $userGroup,
			'displayStyles' => $displayStyles,

			'permissionData' => $permissionData
		];
		return $this->view('XF:UserGroup\Edit', 'user_group_edit', $viewParams);
	}

	public function actionEdit(ParameterBag $params)
	{
		$userGroup = $this->assertUserGroupExists($params->user_group_id);
		return $this->userGroupAddEdit($userGroup);
	}

	public function actionAdd()
	{
		$userGroup = $this->em()->create('XF:UserGroup');
		return $this->userGroupAddEdit($userGroup);
	}

	protected function userGroupSaveProcess(\XF\Entity\UserGroup $userGroup)
	{
		$form = $this->formAction();

		$input = $this->filter([
			'title' => 'str',
			'display_style_priority' => 'uint',
			'username_css' => 'str',
			'banner_css_class' => 'str',
			'banner_text' => 'str'
		]);

		$input['user_title'] = $this->filter('user_title_override', 'bool')
			? $this->filter('user_title', 'str')
			: '';

		if (!$input['banner_css_class'])
		{
			$input['banner_css_class'] = $this->filter('banner_css_class_other', 'str');
		}

		$form->basicEntitySave($userGroup, $input);

		/** @var \XF\Service\UpdatePermissions $permissionUpdater */
		$permissionUpdater = $this->service('XF:UpdatePermissions');
		$permissions = $this->filter('permissions', 'array');

		$form->apply(function() use ($userGroup, $permissions, $permissionUpdater)
		{
			$permissionUpdater->setUserGroup($userGroup)->setGlobal();
			$permissionUpdater->updatePermissions($permissions);
		});

		return $form;
	}

	public function actionSave(ParameterBag $params)
	{
		$this->assertPostOnly();

		if ($params->user_group_id)
		{
			$userGroup = $this->assertUserGroupExists($params->user_group_id);
		}
		else
		{
			$userGroup = $this->em()->create('XF:UserGroup');
		}

		$this->userGroupSaveProcess($userGroup)->run();

		return $this->redirect($this->buildLink('user-groups') . $this->buildLinkHash($userGroup->user_group_id));
	}

	public function actionDelete(ParameterBag $params)
	{
		$userGroup = $this->assertUserGroupExists($params->user_group_id);
		if (!$userGroup->preDelete())
		{
			return $this->error($userGroup->getErrors());
		}

		if ($this->isPost())
		{
			$userGroup->delete();

			return $this->redirect($this->buildLink('user-groups'));
		}
		else
		{
			$viewParams = [
				'userGroup' => $userGroup
			];
			return $this->view('XF:UserGroup\Delete', 'user_group_delete', $viewParams);
		}
	}

	/**
	 * @param string $id
	 * @param array|string|null $with
	 * @param null|string $phraseKey
	 *
	 * @return \XF\Entity\UserGroup
	 */
	protected function assertUserGroupExists($id, $with = null, $phraseKey = null)
	{
		return $this->assertRecordExists('XF:UserGroup', $id, $with, $phraseKey);
	}

	/**
	 * @return \XF\Repository\UserGroup
	 */
	protected function getUserGroupRepo()
	{
		return $this->repository('XF:UserGroup');
	}
}