<?php

namespace XF\Report;

use XF\Entity\Report;
use XF\Mvc\Entity\Entity;

abstract class AbstractHandler
{
	protected $contentType;

	public function __construct($contentType)
	{
		$this->contentType = $contentType;
	}

	public function canView(Report $report)
	{
		if (!$this->canViewContent($report))
		{
			return false;
		}

		if (!$this->canActionContent($report))
		{
			return false;
		}

		return true;
	}

	protected function canViewContent(Report $report)
	{
		return true;
	}

	protected function canActionContent(Report $report)
	{
		return true;
	}

	abstract public function setupReportEntityContent(Report $report, Entity $content);
	abstract public function getContentTitle(Report $report);
	abstract public function getContentMessage(Report $report);

	public function getContentLink(Report $report)
	{
		return '';
	}

	public function getContentForThreadReport(Report $report, $message)
	{
		$visitor = \XF::visitor();

		return [
			'link' => $this->getContentLink($report),
			'title' => $this->getContentTitle($report),
			'userLink' => $report->User ? \XF::app()->router('public')->buildLink('canonical:members', $report->User) : null,
			'username' => $report->User ? $report->User->username : \XF::phrase('guest'),
			'reporterLink' => \XF::app()->router('public')->buildLink('canonical:members', $visitor),
			'reporter' => $visitor->username,
			'reportReason' => $message,
			'message' => $this->getContentMessage($report),
			'extraDetails' => '',
		];
	}

	public function getTemplateName()
	{
		return 'public:report_content_' . $this->contentType;
	}

	public function getTemplateData(Report $report)
	{
		return [
			'report' => $report,
			'content' => $report->Content,
		];
	}

	public function render(Report $report)
	{
		$template = $this->getTemplateName();
		if (!$template)
		{
			return '';
		}
		return \XF::app()->templater()->renderTemplate($template, $this->getTemplateData($report));
	}

	public function getEntityWith()
	{
		return [];
	}

	public function getContent($id)
	{
		return \XF::app()->findByContentType($this->contentType, $id, $this->getEntityWith());
	}

	public static function getWebhookEvents(): array
	{
		return ['report'];
	}
}
