<?php

namespace XF\Mvc;

use XF\Util\Arr;

class RouteMatch
{
	protected $controller = '';
	protected $action = '';
	protected $params = [];
	protected $anchor = null;

	protected $responseType = 'html';

	/**
	 * @var string|null
	 */
	protected $sectionContext = null;

	protected $pathRewrite = null;

	protected $pathRetry = null;

	public function __construct($controller = '', $action = '', $params = [], $responseType = 'html')
	{
		$this->controller = $controller;
		$this->action = $action;

		if ($params instanceof ParameterBag)
		{
			$params = $params->params();
		}
		$this->params = (array) $params;

		$this->responseType = $responseType;
	}

	/**
	 * @param string $action
	 */
	public function setAction($action)
	{
		$this->action = $action;
	}

	/**
	 * @return string
	 */
	public function getAction()
	{
		return $this->action;
	}

	/**
	 * @param string $controller
	 */
	public function setController($controller)
	{
		$this->controller = $controller;
	}

	/**
	 * @return string
	 */
	public function getController()
	{
		return $this->controller;
	}

	/**
	 * @param string $responseType
	 */
	public function setResponseType($responseType)
	{
		$this->responseType = $responseType;
	}

	/**
	 * @return string
	 */
	public function getResponseType()
	{
		return $this->responseType;
	}

	/**
	 * @param string|null $sectionContext
	 */
	public function setSectionContext($sectionContext)
	{
		$this->sectionContext = $sectionContext;
	}

	/**
	 * @return string|null
	 */
	public function getSectionContext()
	{
		return $this->sectionContext;
	}

	/**
	 * @return array
	 */
	public function getParams()
	{
		return $this->params;
	}

	/**
	 * @return ParameterBag
	 */
	public function getParameterBag()
	{
		return new ParameterBag($this->params);
	}

	/**
	 * @param array|ParameterBag $params
	 * @param bool $merge
	 */
	public function setParams($params, $merge = true)
	{
		if ($params instanceof ParameterBag)
		{
			$params = $params->params();
		}

		if ($merge)
		{
			$this->params = Arr::mapMerge($this->params, $params);
		}
		else
		{
			$this->params = $params;
		}
	}

	/**
	 * @param string $name
	 * @param mixed $value
	 */
	public function setParam($name, $value)
	{
		$this->params[$name] = $value;
	}

	public function setAnchor(?string $anchor): void
	{
		$this->anchor = $anchor;
	}

	public function getAnchor(): ?string
	{
		return $this->anchor;
	}

	/**
	 * @param null|string $pathRewrite
	 */
	public function setPathRewrite($pathRewrite)
	{
		$this->pathRewrite = $pathRewrite;
	}

	/**
	 * @return null|string
	 */
	public function getPathRewrite()
	{
		return $this->pathRewrite;
	}

	/**
	 * @param null|string $pathRetry
	 */
	public function setPathRetry($pathRetry)
	{
		$this->pathRetry = $pathRetry;
	}

	/**
	 * @return null|string
	 */
	public function getPathRetry()
	{
		return $this->pathRetry;
	}
}
