// Widgets
// Shows UI Components
import pulpcore.animation.Easing;
import pulpcore.image.CoreFont;
import pulpcore.image.CoreImage;
import pulpcore.Input;
import pulpcore.scene.Scene2D;
import pulpcore.sprite.Button;
import pulpcore.sprite.FilledSprite;
import pulpcore.sprite.Group;
import pulpcore.sprite.StretchableSprite;
import pulpcore.Stage;
import pulpcore.math.CoreMath;
import pulpcore.scene.CoverTransition;
import pulpcore.scene.FadeTransition;
import pulpcore.scene.RevealTransition;
import pulpcore.scene.SlideTransition;
import pulpcore.scene.ZoomTransition;
import static pulpcore.image.Colors.*;

public class Transitions extends Scene2D {
    
    Button zoomOutButton, zoomInButton;
    Button slideLeft, slideRight, slideUp, slideDown;
    Button fadeButton;
    Button checkbox;
    Button revealButton, coverButton;
    Group form;
    
    @Override
    public void load() {
        CoreFont font = CoreFont.getSystemFont().tint(WHITE);
        
        CoreImage checkboxImage = CoreImage.load("checkbox.png");
        checkbox = Button.createLabeledToggleButton(checkboxImage.split(3,2), font,
            "I'm feeling slanted", 225, 110, 30, 12, 0.0, 0.5, false);
        checkbox.setCursor(Input.CURSOR_DEFAULT);
        checkbox.setPixelLevelChecks(false);
        checkbox.setAnchor(0, 0.5);
        
        zoomOutButton = Button.createLabeledButton("Zoom Out", 240, 150);//new Button(buttonImage.split(3), 225, 210);
        zoomOutButton.setAnchor(0.5, 0);
        zoomInButton = Button.createLabeledButton("Zoom In", 240, 180);
        zoomInButton.setAnchor(0.5, 0);

        fadeButton = Button.createLabeledButton("Fade", 240, 210);
        fadeButton.setAnchor(0.5, 0.0);

        slideLeft = Button.createLabeledButton("<-", 0, 160);
        slideLeft.setAnchor(0.5, 0.5);
        slideRight = Button.createLabeledButton("->", 480, 160);
        slideRight.setAnchor(0.5, 0.5);
        slideUp = Button.createLabeledButton("Up", 240, 0);
        slideUp.setAnchor(0.5, 0.5);
        slideDown = Button.createLabeledButton("Down", 240, 320);
        slideDown.setAnchor(0.5, 0.5);

        revealButton = Button.createLabeledButton("Reveal", 240, 240);
        revealButton.setAnchor(0.5, 0.0);
        coverButton = Button.createLabeledButton("Cover", 240, 270);
        coverButton.setAnchor(0.5, 0.0);
        
        form = new Group(Stage.getWidth() / 2, Stage.getHeight() / 2, 480, 320);
        form.setAnchor(0.5, 0.5);
        form.add(new StretchableSprite("border.9.png", 0, 0, 480, 320));
        form.add(checkbox);
        form.add(zoomOutButton);
        form.add(zoomInButton);
        form.add(slideLeft);
        form.add(slideRight);
        form.add(slideUp);
        form.add(slideDown);
        form.add(fadeButton);
        form.add(revealButton);
        form.add(coverButton);

        // Add background and form to the scene
        int bgcolor = rgb(CoreMath.rand(0, 255), CoreMath.rand(0, 255), CoreMath.rand(0, 255));
        if (lastbgcolor != -1) bgcolor = lastbgcolor;
        lastbgcolor = bgcolor;
        add(new FilledSprite(bgcolor));
        addLayer(form);
    }

    static int lastbgcolor = -1;
    
    @Override
    public void update(int elapsedTime) {
        lastbgcolor = -1; //hack

        if (checkbox.isClicked()) {
            double newAngle = checkbox.isSelected() ? Math.PI/16 : 0;
            form.angle.animateTo(newAngle, 500, Easing.ELASTIC_OUT);
        }
        if (slideLeft.isClicked()) {
            SlideTransition trans = new SlideTransition();
            trans.direction(trans.LEFT)
                 .duration(1000)
                 .transitionTo(new Transitions())
                 .easing(Easing.REGULAR_IN_OUT)
                 .replaceScene();
        }
        if (slideRight.isClicked()) {
            SlideTransition trans = new SlideTransition();
            trans.direction(trans.RIGHT)
                 .duration(1000)
                 .transitionTo(new Transitions())
                 .easing(Easing.STRONG_OUT)
                 .replaceScene();
        }
        if (slideUp.isClicked()) {
            SlideTransition trans = new SlideTransition();
            trans.direction(trans.UP)
                 .duration(1000)
                 .transitionTo(new Transitions())
                 .easing(Easing.NONE)
                 .replaceScene();
        }
        if (slideDown.isClicked()) {
            SlideTransition trans = new SlideTransition();
            trans.direction(trans.DOWN)
                 .duration(1000)
                 .transitionTo(new Transitions())
                 .easing(Easing.BACK_IN_OUT)
                 .replaceScene();
        }
        if (fadeButton.isClicked()) {
            FadeTransition trans = new FadeTransition();
            trans.duration(1000).transitionTo(new Transitions()).replaceScene();
        }
        if (zoomOutButton.isClicked()) {
            ZoomTransition trans = new ZoomTransition();
            trans.zoomOut().duration(1000).transitionTo(new Transitions()).easing(Easing.STRONG_OUT).replaceScene();
        }
        if (zoomInButton.isClicked()) {
            ZoomTransition trans = new ZoomTransition();
            trans.zoomIn().duration(1000).transitionTo(new Transitions()).easing(Easing.STRONG_OUT).replaceScene();
        }
        if (revealButton.isClicked()) {
            RevealTransition trans = new RevealTransition();
            trans.duration(1000).transitionTo(new Transitions()).easing(Easing.STRONG_OUT).replaceScene();
        }
        if (coverButton.isClicked()) {
            CoverTransition trans = new CoverTransition();
            trans.duration(1000).transitionTo(new Transitions()).easing(Easing.STRONG_OUT).replaceScene();
        }
        
    }
}