// import * as Phaser from 'phaser';
import Sizer from '../sizer/Sizer';

export default SplitPanels;

declare namespace SplitPanels {

    /**
     * Configuration options for creating a SplitPanels container.
     */
    interface IConfig extends Sizer.IConfig {
        /**
         * Spacing configuration for the layout.
         */
        space?: {
            /**
             * Left padding.
             */
            left?: number,
            /**
             * Right padding.
             */
            right?: number,
            /**
             * Top padding.
             */
            top?: number,
            /**
             * Bottom padding.
             */
            bottom?: number,
            /**
             * Spacing between items.
             */
            item?: number

            /**
             * Extra top spacing for the left panel.
             */
            leftPanelTop?: number,
            /**
             * Extra bottom spacing for the left panel.
             */
            leftPanelBottom?: number,
            /**
             * Extra left spacing for the left panel.
             */
            leftPanelLeft?: number,
            /**
             * Extra right spacing for the left panel.
             */
            leftPanelRight?: number,
            /**
             * Extra top spacing for the right panel.
             */
            rightPanelTop?: number,
            /**
             * Extra bottom spacing for the right panel.
             */
            rightPanelBottom?: number,
            /**
             * Extra left spacing for the right panel.
             */
            rightPanelLeft?: number,
            /**
             * Extra right spacing for the right panel.
             */
            rightPanelRight?: number,

            /**
             * Extra top spacing for the top panel.
             */
            topPanelTop?: number,
            /**
             * Extra bottom spacing for the top panel.
             */
            topPanelBottom?: number,
            /**
             * Extra left spacing for the top panel.
             */
            topPanelLeft?: number,
            /**
             * Extra right spacing for the top panel.
             */
            topPanelRight?: number,
            /**
             * Extra top spacing for the bottom panel.
             */
            bottomPanelTop?: number,
            /**
             * Extra bottom spacing for the bottom panel.
             */
            bottomPanelBottom?: number,
            /**
             * Extra left spacing for the bottom panel.
             */
            bottomPanelLeft?: number,
            /**
             * Extra right spacing for the bottom panel.
             */
            bottomPanelRight?: number,

            /**
             * Extra top spacing for the splitter.
             */
            splitterTop?: number,
            /**
             * Extra bottom spacing for the splitter.
             */
            splitterBottom?: number,
            /**
             * Extra left spacing for the splitter.
             */
            splitterLeft?: number,
            /**
             * Extra right spacing for the splitter.
             */
            splitterRight?: number,

            /**
             * Extra spacing after header.
             */
            header?: number,
            /**
             * Extra spacing before footer.
             */
            footer?: number,
        },

        /**
         * Background game object.
         */
        background?: Phaser.GameObjects.GameObject,

        /**
         * Optional header game object.
         */
        header?: Phaser.GameObjects.GameObject,

        /**
         * Optional footer game object.
         */
        footer?: Phaser.GameObjects.GameObject,

        /**
         * Left panel game object.
         */
        leftPanel?: Phaser.GameObjects.GameObject,
        /**
         * Top panel game object.
         */
        topPanel?: Phaser.GameObjects.GameObject,

        /**
         * Right panel game object.
         */
        rightPanel?: Phaser.GameObjects.GameObject,
        /**
         * Bottom panel game object.
         */
        bottomPanel?: Phaser.GameObjects.GameObject,

        /**
         * Splitter game object.
         */
        splitter?: Phaser.GameObjects.GameObject,

        /**
         * Alignment configuration.
         */
        align?: {
            header?: Sizer.AlignTypes,
            footer?: Sizer.AlignTypes,
        },

        /**
         * Expand configuration.
         */
        expand?: {
            header?: boolean,
            footer?: boolean,
        },

        /**
         * Minimum width for the left panel.
         */
        minLeftPanelWidth?: number,
        /**
         * Minimum width for the right panel.
         */
        minRightPanelWidth?: number,

        /**
         * Minimum height for the top panel.
         */
        minTopPanelHeight?: number,
        /**
         * Minimum height for the bottom panel.
         */
        minBottomPanelHeight?: number,

        /**
         * Initial split ratio.
         */
        splitRatio?: number,
    }

}

/**
 * A resizable split panel container.
 */
declare class SplitPanels extends Sizer {
    /**
     * Create a SplitPanels container.
     *
     * @param scene - The Phaser.Scene that owns this SplitPanels container.
     * @param config - Configuration options for the SplitPanels container.
     */
    constructor(
        scene: Phaser.Scene,
        config?: SplitPanels.IConfig
    );

    /**
     * Enable or disable the splitter.
     *
     * @param enable - Whether the splitter is enabled.
     * @returns This SplitPanels instance.
     */
    setSplitterEnable(enable?: boolean): this;
    /**
     * Whether the splitter is enabled.
     */
    splitterEnable: boolean;

    /**
     * Set the minimum width for the left panel.
     *
     * @param value - The minimum width.
     * @returns This SplitPanels instance.
     */
    setMinLeftPanelWidth(value: number): this;
    /**
     * Minimum width for the left panel.
     */
    minLeftPanelWidth: number;
    /**
     * Set the minimum width for the right panel.
     *
     * @param value - The minimum width.
     * @returns This SplitPanels instance.
     */
    setMinRightPanelWidth(value: number): this;
    /**
     * Minimum width for the right panel.
     */
    minRightPanelWidth: number;

    /**
     * Set the minimum height for the top panel.
     *
     * @param value - The minimum height.
     * @returns This SplitPanels instance.
     */
    setMinTopPanelHeight(value: number): this;
    /**
     * Minimum height for the top panel.
     */
    minTopPanelHeight: number;
    /**
     * Set the minimum height for the bottom panel.
     *
     * @param value - The minimum height.
     * @returns This SplitPanels instance.
     */
    setMinBottomPanelHeight(value: number): this;
    /**
     * Minimum height for the bottom panel.
     */
    minBottomPanelHeight: number;

    /**
     * Set the split ratio between panels.
     *
     * @param value - The split ratio value.
     * @returns This SplitPanels instance.
     */
    setSplitRatio(value: number): this;
    /**
     * Current split ratio between panels.
     */
    splitRatio: number;

    /**
     * Left panel game object.
     */
    readonly leftPanel: Phaser.GameObjects.GameObject;
    /**
     * Top panel game object.
     */
    readonly topPanel: Phaser.GameObjects.GameObject;

    /**
     * Right panel game object.
     */
    readonly rightPanel: Phaser.GameObjects.GameObject;

    /**
     * Bottom panel game object.
     */
    readonly bottomPanel: Phaser.GameObjects.GameObject;

}
