<?php
declare( strict_types = 1 );

namespace MediaWiki\Extension\Translate\MessageBundleTranslation;

use Content;
use InvalidArgumentException;
use MediaWiki\Content\Renderer\ContentParseParams;
use MediaWiki\Content\ValidationParams;
use MediaWiki\Parser\ParserOutput;
use StatusValue;
use TextContentHandler;
use const CONTENT_FORMAT_JSON;

/**
 * @author Niklas Laxström
 * @license GPL-2.0-or-later
 * @since 2021.05
 */
class MessageBundleContentHandler extends TextContentHandler {
	public function __construct( $modelId = MessageBundleContent::CONTENT_MODEL_ID ) {
		parent::__construct( $modelId, [ CONTENT_FORMAT_JSON ] );
	}

	protected function getContentClass(): string {
		return MessageBundleContent::class;
	}

	public function makeEmptyContent(): Content {
		$class = $this->getContentClass();
		return new $class( '{}' );
	}

	public function validateSave( Content $content, ValidationParams $validationParams ) {
		// This will give an informative error message when trying to change the content model
		try {
			if ( $content instanceof MessageBundleContent ) {
				$content->validate();
			}
			return StatusValue::newGood();
		} catch ( MalformedBundle $e ) {
			// XXX: We have no context source nor is there Message::messageParam :(
			return StatusValue::newFatal( 'translate-messagebundle-validation-error', wfMessage( $e ) );
		}
	}

	/** @inheritDoc */
	protected function fillParserOutput(
		Content $content,
		ContentParseParams $cpoParams,
		ParserOutput &$parserOutput
	) {
		if ( !$content instanceof MessageBundleContent ) {
			throw new InvalidArgumentException(
				'Expected $content to be MessageBundleContent; got: ' . get_class( $content )
			);
		}

		$label = $content->getMetadata()->getLabel();
		if ( $label !== null ) {
			$parserOutput->setDisplayTitle( $label );
		}

		if ( $cpoParams->getGenerateHtml() && $content->isValid() ) {
			/** @param $content JsonContent::class */
			$parserOutput->setRawText( $content->rootValueTable( $content->getData()->getValue() ) );
			$parserOutput->addModuleStyles( [ 'mediawiki.content.json' ] );
		} else {
			$parserOutput->setRawText( null );
		}
	}
}
