<?php

namespace MediaWiki\Extension\DiscussionTools\Tests;

use MediaWiki\Extension\DiscussionTools\ApiDiscussionToolsPageInfo;
use MediaWiki\Tests\Api\ApiTestCase;
use Wikimedia\TestingAccessWrapper;

/**
 * @group medium
 * @group Database
 * @covers \MediaWiki\Extension\DiscussionTools\ApiDiscussionToolsPageInfo
 */
class ApiDiscussionToolsPageInfoTest extends ApiTestCase {

	use TestUtils;

	/**
	 * @dataProvider provideGetThreadItemsHtml
	 */
	public function testGetThreadItemsHtml(
		string $name, string $title, string $dom, string $expected, string $config, string $data
	): void {
		$dom = static::getHtml( $dom );
		$expectedPath = $expected;
		$expected = static::getJson( $expected );
		$config = static::getJson( $config );
		$data = static::getJson( $data );

		$doc = static::createDocument( $dom );
		$container = static::getThreadContainer( $doc );

		$title = $this->getServiceContainer()->getTitleParser()->parseTitle( $title );
		$threadItemSet = $this->createParser( $config, $data )->parse( $container, $title );

		$pageInfo = TestingAccessWrapper::newFromClass( ApiDiscussionToolsPageInfo::class );

		$threadItemsHtml = $pageInfo->getThreadItemsHtml( $threadItemSet, false );

		// Optionally write updated content to the JSON files
		if ( getenv( 'DISCUSSIONTOOLS_OVERWRITE_TESTS' ) ) {
			static::overwriteJsonFile( $expectedPath, $threadItemsHtml );
		}

		static::assertEquals( $expected, $threadItemsHtml, $name );
	}

	public static function provideGetThreadItemsHtml(): array {
		return static::getJson( '../cases/threaditemshtml.json' );
	}

	/**
	 * @covers \MediaWiki\Extension\DiscussionTools\ApiDiscussionToolsPageInfo::execute
	 */
	public function testExecuteApiDiscussionToolsPageInfo() {
		$page = $this->getNonexistingTestPage( __METHOD__ );
		$this->editPage( $page, 'add DT pageinfo content' );

		$params = [
			'action' => 'discussiontoolspageinfo',
			'page' => $page->getTitle()->getText(),
		];

		$result = $this->doApiRequestWithToken( $params );

		$this->assertNotEmpty( $result[0]['discussiontoolspageinfo'] );
		$this->assertArrayHasKey( 'transcludedfrom', $result[0]['discussiontoolspageinfo'] );
	}

}