// import * as Phaser from 'phaser';
import Sizer from '../sizer/Sizer';

export default HolyGrail;

declare namespace HolyGrail {

    /**
     * Horizontal alignment options.
     */
    type HAlignTypes = number | 'left' | 'center' | 'right';
    /**
     * Vertical alignment options.
     */
    type VAlignTypes = number | 'top' | 'center' | 'bottom';
    /**
     * Layout mode presets of holy-grail arrangement.
     */
    type LayoutModeTypes = 0 | 1 | 2 | 3 | 'FFF' | 'LFF' | 'FFR' | 'LFR';

    /**
     * Build configuration for holy-grail sections.
     */
    interface IBuildConfig {
        /**
         * Layout mode preset.
         */
        layoutMode?: LayoutModeTypes,

        /**
         * Optional background game object.
         */
        background?: Phaser.GameObjects.GameObject,

        /**
         * Header game object.
         */
        header?: Phaser.GameObjects.GameObject,

        /**
         * Left-side game object.
         */
        leftSide?: Phaser.GameObjects.GameObject,

        /**
         * Content game object.
         */
        content?: Phaser.GameObjects.GameObject,

        /**
         * Right-side game object.
         */
        rightSide?: Phaser.GameObjects.GameObject,

        /**
         * Footer game object.
         */
        footer?: Phaser.GameObjects.GameObject,

        proportion?: {
            header?: number,
            leftSide?: number,
            content?: number,
            rightSide?: number,
            footer?: number,
        },

        expand?: {
            header?: boolean,
            leftSide?: boolean,
            content?: boolean,
            rightSide?: boolean,
            footer?: boolean,
        },

        align?: {
            header?: HAlignTypes,
            leftSide?: VAlignTypes,
            content?: HAlignTypes | VAlignTypes,
            rightSide?: VAlignTypes,
            footer?: HAlignTypes,
        },
    }

    /**
     * Full configuration for creating a holy-grail layout.
     */
    interface IConfig extends Sizer.IConfig, IBuildConfig {
        space?: {
            left?: number,
            right?: number,
            top?: number,
            bottom?: number,

            header?: number | {
                left?: number,
                right?: number,
                top?: number,
                bottom?: number
            },
            leftSide?: number | {
                left?: number,
                right?: number,
                top?: number,
                bottom?: number
            },
            content?: {
                left?: number,
                right?: number,
                top?: number,
                bottom?: number
            },
            rightSide?: number | {
                left?: number,
                right?: number,
                top?: number,
                bottom?: number
            },
            footer?: number | {
                left?: number,
                right?: number,
                top?: number,
                bottom?: number
            },
        };
    }

}

/**
 * Composite sizer implementing a holy-grail page layout.
 */
declare class HolyGrail extends Sizer {
    /**
     * Create a holy-grail layout component.
     *
     * @param scene - Scene that owns this component.
     * @param config - Optional layout configuration.
     */
    constructor(
        scene: Phaser.Scene,
        config?: HolyGrail.IConfig
    );

    /**
     * Build or rebuild layout sections.
     *
     * @param config - Optional build configuration.
     * @returns This component instance.
     */
    build(config?: HolyGrail.IBuildConfig): this;

}
