import ComponentBase from '../../utils/componentbase/ComponentBase';

export default TextPage;

declare namespace TextPage {
    /**
     * Configuration for the TextPage component.
     */
    interface IConfig {
        /**
         * Initial text content.
         */
        text?: string | string[],
        /**
         * Maximum lines per page.
         */
        maxLines?: number,
        /**
         * Page break string.
         */
        pageBreak?: string,
    }
}

/**
 * Paginate and navigate text content by pages or lines.
 */
declare class TextPage extends ComponentBase {
    /**
     * @param gameObject - Target game object.
     * @param config - Optional configuration.
     */
    constructor(
        gameObject: Phaser.GameObjects.GameObject,
        config?: TextPage.IConfig
    );

    /**
     * Set the maximum lines per page.
     *
     * @param maxLines - Maximum lines per page.
     * @returns This TextPage instance.
     */
    setMaxLines(maxLines: number): this;
    /**
     * Maximum lines per page.
     */
    maxLines: number;

    /**
     * Set the page break string.
     *
     * @param pageBreak - Page break string.
     * @returns This TextPage instance.
     */
    setPageBreak(pageBreak?: string): this;
    /**
     * Page break string.
     */
    pageBreak: string;

    /**
     * Replace all text content.
     *
     * @param text - Text content.
     * @returns This TextPage instance.
     */
    setText(text: string | string[]): this;
    /**
     * Append text content.
     *
     * @param text - Text content.
     * @returns This TextPage instance.
     */
    appendText(text: string | string[]): this;
    /**
     * Append a new page of text.
     *
     * @param text - Text content.
     * @returns This TextPage instance.
     */
    appendPage(text: string | string[]): this;
    /**
     * Clear all text content.
     *
     * @returns This TextPage instance.
     */
    clearText(): this;

    /**
     * Show a page by index.
     *
     * @param pageIndex - Page index, starting at 0.
     * @returns This TextPage instance.
     */
    showPage(pageIndex?: number): this;
    /**
     * Show the next page.
     *
     * @returns This TextPage instance.
     */
    showNextPage(): this;
    /**
     * Show the previous page.
     *
     * @returns This TextPage instance.
     */
    showPreviousPage(): this;
    /**
     * Show the first page.
     *
     * @returns This TextPage instance.
     */
    showFirstPage(): this;
    /**
     * Show the last page.
     *
     * @returns This TextPage instance.
     */
    showLastPage(): this;

    /**
     * Get a page by index.
     *
     * @param pageIndex - Page index, starting at 0.
     * @returns Page content.
     */
    getPage(pageIndex?: number): string;
    /**
     * Get the next page content.
     *
     * @returns Page content.
     */
    getNextPage(): string;
    /**
     * Get the previous page content.
     *
     * @returns Page content.
     */
    getPreviousPage(): string;
    /**
     * Get the first page content.
     *
     * @returns Page content.
     */
    getFirstPage(): string;
    /**
     * Get the last page content.
     *
     * @returns Page content.
     */
    getLastPage(): string;

    /**
     * Whether current page is the last page.
     */
    readonly isLastPage: boolean;
    /**
     * Whether current page is the first page.
     */
    readonly isFirstPage: boolean;

    /**
     * Current page index.
     */
    readonly pageIndex: number;
    /**
     * Total number of pages.
     */
    readonly pageCount: number;
    /**
     * Current page height in pixels.
     */
    readonly pageHeight: number;

    /**
     * Show a page by line index.
     *
     * @param lineIndex - Line index, starting at 0.
     * @returns This TextPage instance.
     */
    showPageByLineIndex(lineIndex: number): this;
    /**
     * Show the next line.
     *
     * @returns This TextPage instance.
     */
    showNextLine(): this;
    /**
     * Show the previous line.
     *
     * @returns This TextPage instance.
     */
    showPreviousLine(): this;
    /**
     * Show the first line.
     *
     * @returns This TextPage instance.
     */
    showFirstLine(): this;
    /**
     * Show the last line.
     *
     * @returns This TextPage instance.
     */
    showLastLine(): this;

    /**
     * Get a page by line index.
     *
     * @param lineIndex - Line index, starting at 0.
     * @returns Page content.
     */
    getPageByLineIndex(lineIndex: number): string;
    /**
     * Get the page content for the next line.
     *
     * @returns Page content.
     */
    getPageOfNextLine(): string;
    /**
     * Get the page content for the previous line.
     *
     * @returns Page content.
     */
    getPageOfPreviousLine(): string;
    /**
     * Get the page content for the first line.
     *
     * @returns Page content.
     */
    getPageOfFirstLine(): string;
    /**
     * Get the page content for the last line.
     *
     * @returns Page content.
     */
    getPageOfLastLine(): string;

    /**
     * Whether current line is the first line.
     */
    readonly isFirstLine: boolean;
    /**
     * Whether current line is the last line.
     */
    readonly isLastLine: boolean;

    /**
     * Start line index of the current page.
     */
    readonly startLineIndex: number;
    /**
     * End line index of the current page.
     */
    readonly endLineIndex: number;
    /**
     * Total number of lines.
     */
    readonly totalLinesCount: number;
}
