<?php

namespace XF\Job;

use function is_array;

class Sitemap extends AbstractJob
{
	protected $defaultData = [
		'state' => null,
	];

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

		$builder = $this->app->sitemapBuilder();
		if ($this->data['state'] && is_array($this->data['state']))
		{
			$builder->setupFromJobData($this->data['state']);
		}

		$timeRemaining = $maxRunTime;

		do
		{
			$hasMore = $builder->build($timeRemaining);

			$this->data['state'] = $builder->getDataForJob();
			$this->saveIncrementalData();

			// we need to throw away the previous entity cache to prevent potential memory issues
			$this->app->em()->clearEntityCache();

			$timeRemaining = $maxRunTime - (microtime(true) - $s);
		}
		while ($hasMore && $timeRemaining >= 0.5);

		if (!$hasMore)
		{
			return $this->complete();
		}

		return $this->resume();
	}

	public function getStatusMessage()
	{
		$actionPhrase = \XF::phrase('rebuilding');
		$typePhrase = \XF::phrase('sitemap');

		$state = $this->data['state'];

		if (!empty($state['finalizing']))
		{
			$phrase = \XF::phrase('finalizing');
			$text = "$phrase - $state[finalize_file]";

			return sprintf('%s... %s (%s)', $actionPhrase, $typePhrase, $text);
		}

		if (!empty($state['current_type']))
		{
			$contentType = $this->app->getContentTypePhrase($state['current_type'], true);
			$text = "$contentType $state[last_type_id]";

			return sprintf('%s... %s (%s)', $actionPhrase, $typePhrase, $text);
		}

		return sprintf('%s... %s', $actionPhrase, $typePhrase);
	}

	public function canCancel()
	{
		return true;
	}

	public function canTriggerByChoice()
	{
		return true;
	}
}
