<?php

namespace MediaWiki\Extension\DiscussionTools\Tests;

use DOMDocument;
use MediaWiki\Extension\DiscussionTools\CommentParser;
use MediaWiki\MediaWikiServices;
use MediaWikiTestCase;

abstract class CommentTestCase extends MediaWikiTestCase {

	/**
	 * Create a DOMDocument from a string
	 *
	 * @param string $html
	 * @return DOMDocument
	 */
	protected static function createDocument( string $html ) : DOMDocument {
		$doc = new DOMDocument();
		$doc->preserveWhiteSpace = false;
		$doc->loadHTML( '<?xml encoding="utf-8" ?>' . $html, LIBXML_NOERROR );
		return $doc;
	}

	/**
	 * Get parsed JSON from path
	 *
	 * @param string $relativePath
	 * @param bool $assoc See json_decode()
	 * @return array
	 */
	protected static function getJson( string $relativePath, bool $assoc = true ) : array {
		$json = json_decode(
			file_get_contents( __DIR__ . '/' . $relativePath ),
			$assoc
		);
		return $json;
	}

	/**
	 * Get HTML from path
	 *
	 * @param string $relativePath
	 * @return string
	 */
	protected static function getHtml( string $relativePath ) : string {
		$html = file_get_contents( __DIR__ . '/../' . $relativePath );

		// Remove all but the body tags from full Parsoid docs
		if ( strpos( $html, '<body' ) !== false ) {
			preg_match( '`<body[^>]*>(.*)</body>`s', $html, $match );
			$html = "<div>$match[1]</div>";
		}

		return $html;
	}

	/**
	 * Create a comment pareser
	 *
	 * @param array $data
	 * @return CommentParser
	 */
	protected static function createParser( array $data ) : CommentParser {
		$services = MediaWikiServices::getInstance();
		return new CommentParser(
			$services->getContentLanguage(),
			$services->getMainConfig(),
			$data
		);
	}

	/**
	 * Setup the MW environment
	 *
	 * @param array $config
	 * @param array $data
	 */
	protected function setupEnv( array $config, array $data ) : void {
		$this->setMwGlobals( $config );
		$this->setMwGlobals( [
			'wgArticlePath' => $config['wgArticlePath'],
			'wgNamespaceAliases' => $config['wgNamespaceIds'],
			// TODO: Move this to $config
			'wgLocaltimezone' => $data['localTimezone']
		] );
		$this->setUserLang( $config['wgContentLang'] );
		$this->setContentLang( $config['wgContentLang'] );
	}
}