Engine.DialogBlockerInfo = class {

    constructor()
    {
        this.color = new Color(0, 0, 0);
        this.alpha = 0.5;
    }

    equals(blockerInfo)
    {
        return blockerInfo.color == this.color && blockerInfo.alpha == this.alpha;
    }

}

Engine.DialogBlocker = class extends Engine.Drawable
{
    constructor()
    {
        super();
        
        this.blockerInfo = null;
        this.used = false;
        this.isBlocker = true;
        this.mouseEnabled = true;
        // this.interactive = true;
        // this.interactiveChildren = true;
    }

    drawFullScreen()
    {
        this.draw(EngineSettings.screenWidth, EngineSettings.screenHeight);
    }

    draw(w, h)
    {
        this.setAsBox(this.graphics, w, h, this.blockerInfo.color, this.blockerInfo.alpha)
        //this.beginFill(this.blockerInfo.color, this.blockerInfo.alpha);
        //this.drawRect(0, 0, w, h);
        this.hitArea = this.getLocalBounds();
    }
}


Engine.Dialog = class extends Engine.Drawable {

    constructor(parentClip)
    {
        super();

        this.isDialog = true;
        this.dt = new Engine.DialogTransitionerSlide(this);
        
        this.shakeTween = new Engine.SimpleTween();
        this.currentShakeOffset = 0;
        this.dialogY = 0;
        this.originalY = 0;

        this.blockerInfo = new Engine.DialogBlockerInfo();
        this.alwaysOnBottom = false;

        this.parentClip = parentClip;
        this.active = false;

        this.dialogWidth = 0;
        this.dialogHeight = 0;

        this.playDialogSounds = true;
        this.hiding = false;

        this.onHideFinish = new Action();
        this.clickBgToClose = false;

        this.hideClickRegion = null;
    }

    addParentLayerUnderAllOfSameType()
    {
        if (this.parentClip == null) return;

        var others = Engine.DialogManagerInstance.getAllActiveDialogs(this.constructor);
        var index = null;
        for (var d of others)
        {
            if (this.parentClip.contains(d))
            {
                var cIndex = this.parentClip.getChildIndex(d);
                if (index == null || cIndex < index)
                {
                    index = cIndex;
                }
            }
        }
        if (index != null)
        {
            this.parentClip.addChildAt(this, index);
        }
        else
        {
            this.parentClip.addChild(this);
        }
    }

    get isTransitioning() { return this.dt != null && this.dt.active; }

    get clickBackgroundToClose() { return this.clickBgToClose; }
    set clickBackgroundToClose(value)
    {
        if (this.clickBgToClose != value)
        {
            this.clickBgToClose = value;
            if (this.clickBgToClose)
            {
                if (this.hideClickRegion == null)
                {
                    //this.hideClickRegion = new PIXI.Graphics();
                    //this.hideClickRegion.interactive = true;
                    //this.hideClickRegionHandler = (event) => { this.hideClickRegionClicked(event); };

                    this.hideClickRegion = new Engine.Drawable();
                    this.hideClickRegion.mouseEnabled = true;
                }
                //this.hideClickRegion.on('pointerdown', this.hideClickRegionHandler);
                this.hideClickRegion.events.onMouseDown.addListener(this, this.hideClickRegionClicked);
            }
            else
            {
                if (this.hideClickRegion != null)
                {
                    //this.hideClickRegion.off('pointerdown', this.hideClickRegionHandler);
                    this.hideClickRegion.events.onMouseDown.removeListener(this, this.hideClickRegionClicked);
                }
            }
        }
    }

    hideClickRegionClicked()
    {
        this.hide();
    }

    hide(instant)
    {
        if (instant === undefined) instant = false;

        //Already hiding? lets not hide again...
        if (this.hiding) return;

        if (this.hideClickRegion != null) this.removeChild(this.hideClickRegion);

        this.hiding = true;

        if (instant)
        {
            this.finishHide();
        }
        else
        {
            this.dt.transitionOut(() => { this.finishHide(); });
        }

        Engine.DialogManagerInstance.fireActiveDialogsChanged();
        Engine.DialogManagerInstance.fireDialogTransitioned(this.constructor, Engine.DialogManagerStatics.TransitionType.Hidden);
    
        if (this.playDialogSounds) Engine.SoundPlayerInstance.playSound(65);
    }

    
    finishHide()
    {
        Engine.EnterFrameManagerInstance.remove(this);
        this.parentClip.removeChild(this);
        this.active = false;
        this.hiding = false;
        if (this.onHideFinish != null) this.onHideFinish.call();
    }

    finishSlide()
    {
        if (this.clickBackgroundToClose)
        {
            this.addChildAt(this.hideClickRegion, 0);

            //this.hideClickRegion.clear();
            //this.hideClickRegion.beginFill(0xFFFFFF, 0);
            //this.hideClickRegion.drawRect(0, 0, EngineSettings.screenWidth, EngineSettings.screenHeight);
            //this.hideClickRegion.hitArea = this.hideClickRegion.getBounds();
            this.hideClickRegion.setAsBox(this.hideClickRegion.graphics, EngineSettings.screenWidth, EngineSettings.screenHeight, Colors.black, 0);
            
            this.hideClickRegion.x = -this.x;
            this.hideClickRegion.y = -this.y;
        }
        this.originalY = this.y;
        this.dialogY = this.originalY;


        Engine.DialogManagerInstance.fireDialogTransitioned(this.constructor, Engine.DialogManagerStatics.TransitionType.Shown);
    }

    dialogAvailableChanged()
    {
        Engine.DialogManagerInstance.fireDialogAvailableChanged(this);
    }

    update(timeElapsed)
    {

    }

    resolutionChanged(width, height)
    {
        var targetPosition = this.dt.getTargetPosition();
        this.x = targetPosition.x;
        this.y = targetPosition.y;
        this.originalY = this.y;
        this.dialogY = this.originalY;
    }

    showDialog(instant = false, underAllSameType = false)
    {
        if (underAllSameType)
        {
            this.addParentLayerUnderAllOfSameType();
        }
        else
        {
            this.parentClip.addChild(this);
        }
        this.active = true;
        
        this.dt.transitionIn(()=>{this.finishSlide();} );

        Engine.DialogManagerInstance.addDialogToUpdate(this);

        Engine.DialogManagerInstance.fireActiveDialogsChanged();
        Engine.DialogManagerInstance.fireDialogTransitioned(this.constructor, Engine.DialogManagerStatics.TransitionType.Shown);

        if (this.playDialogSounds) Engine.SoundPlayerInstance.playSound(66);
    }

    showInstant()
    {
        return false;
    }

    doStaticShake(strength , time /*float*/)
    {
        this.shakeTween.init((value) => this.shakeUpdate(value), this.staticShakeTween, 0, strength, time);
        this.shakeTween.onFinish = () => { this.y = this.dialogY = this.originalY; }
    }

    staticShakeTween(t /*float*/, b /*float*/, c /*float*/, d /*float*/)
    {
        return b + Math.sin(t * Math.PI * 13) * c;
    }

    shakeTweenUpdate(t /*float*/, b /*float*/, c /*float*/, d /*float*/)
    {
        t = t / d;
        return b + Math.sin(t * Math.PI * 13) * c * (1 - (t * 0.6));
    }

    shakeUpdate(value /*float*/)
    {
        this.Y = this.dialogY + value;
        this.currentShakeOffset = value;
    }
}

