// import * as Phaser from 'phaser';

export default NinePatch;

declare namespace NinePatch {

    /**
     * Configuration options for creating a NinePatch.
     */
    interface IConfig {
        /**
         * X position.
         */
        x?: number,
        /**
         * Y position.
         */
        y?: number,
        /**
         * Width.
         */
        width?: number,
        /**
         * Height.
         */
        height?: number,

        /**
         * Texture key.
         */
        key?: string,
        /**
         * Base frame name.
         */
        baseFrame?: string,
        /**
         * Frame name.
         */
        frame?: string,
        /**
         * Callback to resolve frame names by column and row.
         */
        getFrameNameCallback?: (colIndex: number, rowIndex: number, baseFrame: string) => (string | undefined),

        /**
         * Column widths.
         */
        columns?: (number | undefined)[],
        /**
         * Left fixed width.
         */
        leftWidth?: number,
        /**
         * Right fixed width.
         */
        rightWidth?: number,

        /**
         * Row heights.
         */
        rows?: (number | undefined)[],
        /**
         * Top fixed height.
         */
        topHeight?: number,
        /**
         * Bottom fixed height.
         */
        bottomHeight?: number,

        /**
         * Stretch mode configuration.
         */
        stretchMode?: 0 | 1 | 'scale' | 'repeat' |
        {
            /**
             * Edge stretch mode.
             */
            edge?: 0 | 1 | 'scale' | 'repeat',
            /**
             * Internal stretch mode.
             */
            internal?: 0 | 1 | 'scale' | 'repeat',
        },

        /**
         * Max fixed part scale for both axes.
         */
        maxFixedPartScale?: number,
        /**
         * Max fixed part scale on X axis.
         */
        maxFixedPartScaleX?: number,
        /**
         * Max fixed part scale on Y axis.
         */
        maxFixedPartScaleY?: number,

        /**
         * Preserve aspect ratio of fixed parts.
         */
        preserveRatio?: boolean,
    }

}

/**
 * RenderTexture-based nine-patch game object.
 */
declare class NinePatch extends Phaser.GameObjects.RenderTexture {
    /**
     * Create a NinePatch with config only.
     *
     * @param scene - Scene instance.
     * @param config - Configuration options.
     */
    constructor(
        scene: Phaser.Scene,
        config?: NinePatch.IConfig
    );

    /**
     * Create a NinePatch with position and config.
     *
     * @param scene - Scene instance.
     * @param x - X position.
     * @param y - Y position.
     * @param config - Configuration options.
     */
    constructor(
        scene: Phaser.Scene,
        x: number,
        y: number,
        config?: NinePatch.IConfig
    );

    /**
     * Create a NinePatch with position, size, and config.
     *
     * @param scene - Scene instance.
     * @param x - X position.
     * @param y - Y position.
     * @param width - Width.
     * @param height - Height.
     * @param config - Configuration options.
     */
    constructor(
        scene: Phaser.Scene,
        x: number,
        y: number,
        width: number,
        height: number,
        config?: NinePatch.IConfig
    );

    /**
     * Create a NinePatch with texture key.
     *
     * @param scene - Scene instance.
     * @param x - X position.
     * @param y - Y position.
     * @param width - Width.
     * @param height - Height.
     * @param key - Texture key.
     * @param config - Configuration options.
     */
    constructor(
        scene: Phaser.Scene,
        x: number,
        y: number,
        width: number,
        height: number,
        key: string,
        config?: NinePatch.IConfig
    );

    /**
     * Create a NinePatch with column and row sizes.
     *
     * @param scene - Scene instance.
     * @param x - X position.
     * @param y - Y position.
     * @param width - Width.
     * @param height - Height.
     * @param key - Texture key.
     * @param columns - Column widths.
     * @param rows - Row heights.
     * @param config - Configuration options.
     */
    constructor(
        scene: Phaser.Scene,
        x: number,
        y: number,
        width: number,
        height: number,
        key: string,
        columns: (number | undefined)[],
        rows: (number | undefined)[],
        config?: NinePatch.IConfig
    );

    /**
     * Create a NinePatch with base frame, columns, and rows.
     *
     * @param scene - Scene instance.
     * @param x - X position.
     * @param y - Y position.
     * @param width - Width.
     * @param height - Height.
     * @param key - Texture key.
     * @param baseFrame - Base frame name.
     * @param columns - Column widths.
     * @param rows - Row heights.
     * @param config - Configuration options.
     */
    constructor(
        scene: Phaser.Scene,
        x: number,
        y: number,
        width: number,
        height: number,
        key: string,
        baseFrame: string,
        columns: (number | undefined)[],
        rows: (number | undefined)[],
        config?: NinePatch.IConfig
    );

    /**
     * Resize the nine-patch.
     *
     * @param width - New width.
     * @param height - New height.
     * @returns This NinePatch instance.
     */
    resize(width: number, height: number): this;

    /**
     * Set base texture using columns and rows.
     *
     * @param key - Texture key.
     * @param baseFrame - Base frame name.
     * @param columns - Column widths.
     * @param rows - Row heights.
     * @returns This NinePatch instance.
     */
    setBaseTexture(
        key: string,
        baseFrame: string | undefined,
        columns: (number | undefined)[],
        rows: (number | undefined)[]
    ): this;

    /**
     * Set base texture using edge sizes.
     *
     * @param key - Texture key.
     * @param baseFrame - Base frame name.
     * @param leftWidth - Left fixed width.
     * @param rightWidth - Right fixed width.
     * @param topHeight - Top fixed height.
     * @param bottomHeight - Bottom fixed height.
     * @returns This NinePatch instance.
     */
    setBaseTexture(
        key: string,
        baseFrame: string | undefined,
        leftWidth: number,
        rightWidth: number,
        topHeight: number,
        bottomHeight: number
    ): this;

    /**
     * Set base texture using key and base frame.
     *
     * @param key - Texture key.
     * @param baseFrame - Base frame name.
     * @returns This NinePatch instance.
     */
    setBaseTexture(
        key: string,
        baseFrame: string | undefined
    ): this;

    /**
     * Set stretch mode.
     *
     * @param mode - Stretch mode configuration.
     * @returns This NinePatch instance.
     */
    setStretchMode(
        mode: 0 | 1 | 'scale' | 'repeat' |
        {
            edge?: 0 | 1 | 'scale' | 'repeat',
            internal?: 0 | 1 | 'scale' | 'repeat',
        }
    ): this;

    /**
     * Set frame-name callback.
     *
     * @param callback - Callback to resolve frame names.
     * @returns This NinePatch instance.
     */
    setGetFrameNameCallback(
        callback: (colIndex: number, rowIndex: number, baseFrame: string) => (string | undefined)
    ): this;

    /**
     * Rebuild texture rendering.
     *
     * @returns This NinePatch instance.
     */
    updateTexture(): this;

    /**
     * Enable or disable ratio preservation.
     *
     * @param enable - Preserve ratio flag.
     * @returns This NinePatch instance.
     */
    setPreserveRatio(enable?: boolean): this;
    /**
     * Preserve-ratio flag.
     */
    preserveRatio: boolean;

    /**
     * Set max fixed-part scale.
     *
     * @param scaleX - Max scale on X axis.
     * @param scaleY - Max scale on Y axis.
     * @returns This NinePatch instance.
     */
    setMaxFixedPartScale(scaleX: number, scaleY?: number): this;
    /**
     * Max fixed-part scale on X axis.
     */
    maxFixedPartScaleX: number;
    /**
     * Max fixed-part scale on Y axis.
     */
    maxFixedPartScaleY: number;

    /**
     * Minimum width based on fixed parts.
     */
    readonly minWidth: number;

    /**
     * Minimum height based on fixed parts.
     */
    readonly minHeight: number;

    /**
     * Current fixed-part scale on X axis.
     */
    readonly fixedPartScaleX: number;

    /**
     * Current fixed-part scale on Y axis.
     */
    readonly fixedPartScaleY: number;

    /**
     * Left fixed width.
     */
    readonly leftWidth: number;
    /**
     * Right fixed width.
     */
    readonly rightWidth: number;
    /**
     * Top fixed height.
     */
    readonly topHeight: number;
    /**
     * Bottom fixed height.
     */
    readonly bottomHeight: number;

}
