<?php

namespace XF\ControllerPlugin;

class TogglePlugin extends AbstractPlugin
{
	public function actionToggle($identifier, $column = 'active', array $options = [])
	{
		$this->assertPostOnly();

		$this->toggle($identifier, $column, $options);

		return $this->message(\XF::phrase('your_changes_have_been_saved'));
	}

	public function toggle($identifier, $column = 'active', array $options = [])
	{
		$options = array_replace([
			'input' => null,
			'preSaveCallback' => null,
		], $options);

		if (!$options['input'])
		{
			$options['input'] = $column;
		}

		$activeState = $this->request->filter($options['input'], 'array-bool');
		$entities = $this->em->findByIds($identifier, array_keys($activeState));

		foreach ($entities AS $id => $entity)
		{
			if ($entity->getExistingValue($column) != $activeState[$id])
			{
				$entity->{$column} = $activeState[$id];

				if ($options['preSaveCallback'])
				{
					$cb = $options['preSaveCallback'];
					$cb($entity);
				}

				$entity->save();
			}
		}
	}
}
