<?php

namespace XF\Job;

use XF\Entity\ReactionContent;
use XF\Finder\ReactionContentFinder;

class ReactionDelete extends AbstractJob
{
	protected $defaultData = [
		'reaction_id' => null,
		'reaction_score' => 0,
		'count' => 0,
		'total' => null,
	];

	public function run($maxRunTime)
	{
		$s = microtime(true);

		if (!$this->data['reaction_id'])
		{
			throw new \InvalidArgumentException('Cannot delete without a reaction_id.');
		}

		$reactionFinder = $this->app->finder(ReactionContentFinder::class)
			->where('reaction_id', $this->data['reaction_id']);

		if ($this->data['total'] === null)
		{
			$this->data['total'] = $reactionFinder->total();
			if (!$this->data['total'])
			{
				return $this->complete();
			}
		}

		$maxFetch = 1000;

		// note that the order doesn't matter here -- we're deleting every entry
		$reactionContents = $reactionFinder->fetch($maxFetch);
		$continue = $reactionContents->count() < $maxFetch ? false : true;

		foreach ($reactionContents AS $reactionContent)
		{
			/** @var ReactionContent $reactionContent */
			$this->data['count']++;

			// the base reaction is gone, so we need to force this to recalculate properly
			$reactionContent->setOption('force_reaction_score', $this->data['reaction_score']);
			$reactionContent->delete(false);

			if ($maxRunTime && microtime(true) - $s > $maxRunTime)
			{
				$continue = true;
				break;
			}
		}

		if ($continue)
		{
			return $this->resume();
		}
		else
		{
			return $this->complete();
		}
	}

	public function getStatusMessage()
	{
		$actionPhrase = \XF::phrase('deleting');
		$typePhrase = \XF::phrase('reactions');
		return sprintf(
			'%s... %s (%s/%s)',
			$actionPhrase,
			$typePhrase,
			\XF::language()->numberFormat($this->data['count']),
			\XF::language()->numberFormat($this->data['total'])
		);
	}

	public function canCancel()
	{
		return false;
	}

	public function canTriggerByChoice()
	{
		return false;
	}
}
