<?php
namespace intec\regionality\seo;

use intec\core\base\BaseObject;

/**
 * Класс, предназначенный для преобразования содержимого в исполняемый код.
 * Class Converter
 * @property string $prologue Начало контента содержимого. Только для чтения.
 * @property string $epilogue Окончание контента содержимого. Только для чтения.
 * @package intec\regionality\seo
 * @author apocalypsisdimon@gmail.com
 */
abstract class Converter extends BaseObject
{
    /**
     * Приводит переводы строк к LF для сравнения содержимого файлов.
     * @param string|null $content
     * @return string
     */
    protected function normalizeForCompare($content)
    {
        if ($content === null || $content === '')
            return '';

        return preg_replace('/\R/u', "\n", $content);
    }

    /**
     * Возвращает начало контента содержимого.
     * @return string
     */
    public function getPrologue()
    {
        return <<<'PROLOGUE'
<?php define('INTEC_REGIONALITY_REGION_RESOLVE', false) ?>
<?php define('INTEC_REGIONALITY_MACROS_REPLACE', false) ?>
<?php require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php') ?>
<?php

use Bitrix\Main\Context;
use Bitrix\Main\Loader;
use intec\regionality\models\Region;
use intec\regionality\models\SiteSettings;

if (!Loader::includeModule('intec.core') || !Loader::includeModule('intec.regionality'))
	return;

$site = Context::getCurrent()->getSite();

if (empty($site))
	return;

$settings = SiteSettings::get($site);
$region = null;
$domain = null;

if ($settings->domainsUse) {
	$region = Region::resolveByDomain(null, $site);

	if (!empty($region))
		$domain = $region->resolveDomain($site, true);
}
if (empty($domain))
	$domain = $settings->getDomain(true);

if (empty($domain))
	return;

?>
PROLOGUE;
    }

    /**
     * Возвращает окончание контента содержимого.
     * @return string
     */
    public function getEpilogue()
    {
        return '';
    }

    /**
     * Оборачивает содержимое в начало и конец.
     * @param string $content Содержимое.
     * @return string
     */
    protected function wrap($content)
    {
        return $this->getPrologue().$content.$this->getEpilogue();
    }

    /**
     * Конвертирует содержимое в исполняемый код.
     * @param string $content Содержимое.
     * @return string
     */
    public abstract function convert($content);
}