<?php

namespace XF\Spam\Cleaner;

use XF\Entity\Node;
use XF\Finder\ThreadFinder;

class Thread extends AbstractHandler
{
	public function canCleanUp(array $options = [])
	{
		return !empty($options['action_threads']);
	}

	public function cleanUp(array &$log, &$error = null)
	{
		$app = \XF::app();

		$action = $app->options()->spamThreadAction;
		if ($action['action'] == 'move')
		{
			$node = $app->em()->find(Node::class, $action['node_id']);
			if (!$node)
			{
				$error = \XF::phrase('spam_cleaner_cannot_be_run_at_moment');
				return false;
			}
		}

		$threadsFinder = $app->finder(ThreadFinder::class);
		$threads = $threadsFinder->where('user_id', $this->user->user_id)->fetch();

		if ($threads->count())
		{
			$submitter = $app->container('spam.contentSubmitter');
			$submitter->submitSpam('thread', $threads->keys());

			$action = $app->options()->spamThreadAction;
			if ($action['action'] == 'move')
			{
				$log['thread'] = [
					'action' => 'moved',
					'threadIds' => [],
				];

				foreach ($threads AS $threadId => $thread)
				{
					if (!isset($log['thread']['threadIds'][$thread->node_id]))
					{
						$log['thread']['threadIds'][$thread->node_id] = [];
					}

					$log['thread']['threadIds'][$thread->node_id][] = $thread->thread_id;

					/** @var \XF\Entity\Thread $thread */
					$thread->setOption('log_moderator', false);
					$thread->node_id = $action['node_id'];
					if ($thread->discussion_state == 'moderated')
					{
						$thread->discussion_state = 'visible';
					}
					$thread->save();
				}
			}
			else // deleted
			{
				$deleteType = ($action['action'] == 'delete' ? 'hard' : 'soft');

				$log['thread'] = [
					'action' => 'deleted',
					'deleteType' => $deleteType,
					'threadIds' => [],
				];

				foreach ($threads AS $threadId => $thread)
				{
					/** @var \XF\Entity\Thread $thread */
					if ($thread->isDeleted())
					{
						// Probably a redirect, which would've been deleted when its target was deleted.
						continue;
					}

					$log['thread']['threadIds'][] = $threadId;

					$thread->setOption('log_moderator', false);
					if ($deleteType == 'soft')
					{
						$thread->softDelete();
					}
					else
					{
						$thread->delete();
					}
				}
			}
		}

		return true;
	}

	public function restore(array $log, &$error = null)
	{
		if ($log['action'] == 'moved')
		{
			foreach ($log['threadIds'] AS $nodeId => $threadIds)
			{
				$threadsFinder = \XF::app()->finder(ThreadFinder::class);
				$threads = $threadsFinder->where('thread_id', $threadIds)->fetch();
				foreach ($threads AS $thread)
				{
					/** @var \XF\Entity\Thread $thread */
					$thread->setOption('log_moderator', false);
					$thread->node_id = $nodeId;
					$thread->save();
				}
			}
		}
		else // deleted
		{
			if ($log['deleteType'] == 'soft')
			{
				$threadsFinder = \XF::app()->finder(ThreadFinder::class);
				$threads = $threadsFinder->where('thread_id', $log['threadIds'])->fetch();
				foreach ($threads AS $thread)
				{
					/** @var \XF\Entity\Thread $thread */
					$thread->setOption('log_moderator', false);
					$thread->discussion_state = 'visible';
					$thread->save();
				}
			}
		}

		return true;
	}
}
