<?php

namespace MediaWiki\Extension\DiscussionTools\ThreadItem;

/**
 * A thread item, either a heading or a comment
 */
interface ThreadItem {
	/**
	 * @return string Thread ID
	 */
	public function getId(): string;

	/**
	 * @return string Thread item name
	 */
	public function getName(): string;

	/**
	 * @return string Thread item type
	 */
	public function getType(): string;

	/**
	 * @return ThreadItem|null Parent thread item
	 */
	public function getParent(): ?ThreadItem;

	/**
	 * @return ThreadItem[] Replies to this thread item
	 */
	public function getReplies(): array;

	/**
	 * @return string|bool `false` if this item is not transcluded. A string if it's transcluded
	 *   from a single page (the page title, in text form with spaces). `true` if it's transcluded, but
	 *   we can't determine the source.
	 */
	public function getTranscludedFrom();

	/**
	 * @return int Indentation level
	 */
	public function getLevel(): int;

	/**
	 * @param bool $deep Whether to include full serialized comments in the replies key
	 * @param callable|null $callback Function to call on the returned serialized array, which
	 *  will be passed into the serialized replies as well if $deep is used
	 * @return array JSON-serializable array
	 */
	public function jsonSerialize( bool $deep = false, ?callable $callback = null ): array;
}