import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.ArcType;
import javafx.stage.Stage;
import java.io.FileInputStream;
import java.io.FileNotFoundException; 
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;  
import javafx.scene.control.Button;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.KeyCode;
import javafx.scene.paint.Color;
import javafx.scene.media.*;
import java.io.File;
import java.io.*;
//import Bicicleta;

public class Something extends Application
{
    public static void main(String[] args)
    {
        Application.launch(args);
    }

    @Override
    public void start(Stage stage)
    {
        //Variable para la distancia que va a avanzar la bici
        double distancia = 10;
        
        Canvas canvas = new Canvas(1300, 800);
        GraphicsContext gc = canvas.getGraphicsContext2D();
       
        gc.setLineWidth(5.0);
        //gc.setStroke(Color.BLUE); //Para poner en azul la linea
        
        Pane root = new Pane();
        
        ImageView imagen;
        Bicicleta bicicleta = new Bicicleta();

        

        try{
            
            FileInputStream inputstream = new FileInputStream("bici.png");
            
            //se setea el tamaño de la imagen!
            Image img = new Image(inputstream, 60, 60, false, false);
           

            imagen = new ImageView(img);

            imagen.setX(5+bicicleta.x);
            imagen.setY(bicicleta.y-40);
            root.getChildren().add(imagen);
            
            
            
            //Crea los botones
            Button boton1 = new Button();
            Button boton2 = new Button();
            Button boton3 = new Button();
            Button boton4 = new Button();
            Button boton5 = new Button();
            Button boton6 = new Button();
            Button boton7 = new Button();
            Button boton8 = new Button();


            //Setea el texto de los botones
            boton1.setText("NO");
            boton2.setText("N");
            boton3.setText("NE");
            boton4.setText("O");
            boton5.setText("E");
            boton6.setText("SO");
            boton7.setText("S");
            boton8.setText("SE");

            //Se define el tamaño de los botones
            boton1.setPrefSize(40, 40);
            boton2.setPrefSize(40, 40);
            boton3.setPrefSize(40, 40);
            boton4.setPrefSize(40, 40);
            boton5.setPrefSize(40, 40);
            boton6.setPrefSize(40, 40);
            boton7.setPrefSize(40, 40);
            boton8.setPrefSize(40, 40);

            //Se setea la ubicación de los botones
            boton1.setLayoutX(0);
            boton1.setLayoutY(0);

            boton2.setLayoutX(50);
            boton2.setLayoutY(0);

            boton3.setLayoutX(100);
            boton3.setLayoutY(0);

            boton4.setLayoutX(0);
            boton4.setLayoutY(50);

            boton5.setLayoutX(100);
            boton5.setLayoutY(50);

            boton6.setLayoutX(0);
            boton6.setLayoutY(100);

            boton7.setLayoutX(50);
            boton7.setLayoutY(100);

            boton8.setLayoutX(100);
            boton8.setLayoutY(100);

            //Se agrega el eventHandler a cada boton
            //Se setea la acción que va a ejecutar al
            //ser Clickeado            
            boton1.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    mover(gc, bicicleta, distancia, 2.3561944901865, imagen);
                }
            });

            boton2.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    mover(gc, bicicleta, distancia, 1.570796326791001, imagen);
                }
            });

            boton3.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    mover(gc, bicicleta, distancia, 0.7853981633955001, imagen);
                }
            });

            boton4.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    mover(gc, bicicleta, distancia, 3.141592653582001, imagen);
                }
            });

            boton5.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    mover(gc, bicicleta, distancia, 0, imagen);
                }
            });

            boton6.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    mover(gc, bicicleta, distancia, 3.9269908169775, imagen);
                }
            });

            boton7.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    mover(gc, bicicleta, distancia, 4.712388980373, imagen);
                }
            });

            boton8.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    mover(gc, bicicleta, distancia, 5.4977871437685, imagen);
                }
            });


            //Se setea el background de la ventana
            root.setStyle("-fx-background-image: url(\"mapamundi.jpg\");");
            
            //Se agrega el canvas al root
            root.getChildren().add(canvas);

            //Agrega los botones al root
            root.getChildren().add(boton1);
            root.getChildren().add(boton2);
            root.getChildren().add(boton3);
            root.getChildren().add(boton4);
            root.getChildren().add(boton5);
            root.getChildren().add(boton6);
            root.getChildren().add(boton7);
            root.getChildren().add(boton8);
            
            //No sé que hace pero vos podés googlear tigre
            Scene scene = new Scene(root);

            //Agrega los eventos del teclado numérico
            scene.setOnKeyPressed(e -> {
                if (e.getCode() == KeyCode.NUMPAD1) {
                    mover(gc, bicicleta, distancia, 3.9269908169775, imagen);
                }
                else if (e.getCode() == KeyCode.NUMPAD2) {
                    mover(gc, bicicleta, distancia, 4.712388980373, imagen);
                }
                else if (e.getCode() == KeyCode.NUMPAD3) {
                    mover(gc, bicicleta, distancia, 5.4977871437685, imagen);
                }
                else if (e.getCode() == KeyCode.NUMPAD4) {
                    mover(gc, bicicleta, distancia, 3.141592653582001, imagen);
                }
                else if (e.getCode() == KeyCode.NUMPAD6) {
                    mover(gc, bicicleta, distancia, 0, imagen);
                }
                else if (e.getCode() == KeyCode.NUMPAD7) {
                    mover(gc, bicicleta, distancia, 2.3561944901865, imagen);
                }
                else if (e.getCode() == KeyCode.NUMPAD8) {
                    mover(gc, bicicleta, distancia, 1.570796326791001, imagen);
                }
                else if (e.getCode() == KeyCode.NUMPAD9) {
                    mover(gc, bicicleta, distancia, 0.7853981633955001, imagen);
                }
                else if (e.getCode() == KeyCode.PLUS) {
                    //distancia++;
                }
                else if (e.getCode() == KeyCode.MINUS) {
                    //distancia--;
                }
                
            });

            //Para agregar la música
            Media media = new Media(new File("audio.mp3").toURI().toString());
            MediaPlayer player = new MediaPlayer(media);             
            player.setAutoPlay(true);
            MediaView mediaView = new MediaView(player);
            root.getChildren().add(mediaView);


            stage.setScene(scene);
            stage.setTitle("izi pizi me paseo en BICI");
            stage.show();

        }catch(FileNotFoundException e){
            System.out.println("Ocurió un error en la carga de imagen!");
            System.out.println(e.getMessage());
        }catch(Exception e){
            System.out.println("error: no se pudo cargar la imagen");
            System.out.println(e.getMessage());
        }

        
    } 

    //Mueve la bicicleta y dibuja su recorrido
    //Recibe como parámetro la distancia y dirección de la bicicleta
    private void mover(GraphicsContext gc, Bicicleta bicicleta, double distancia, double direccion, ImageView imagen){
        double xInicial = 10+bicicleta.x;
        //El 400 se le resta para que aparezca hacia abajo, pues las coordenadas están invertidas
        double yInicial = 400-bicicleta.y;
        
        bicicleta.girar(direccion);
        bicicleta.avanzar(distancia);

        double xFinal = 10+bicicleta.x;
        double yFinal = 400-bicicleta.y;

        gc.strokeLine(xInicial, yInicial, xFinal, yFinal);
        System.out.println(bicicleta.x+" "+ bicicleta.y+" elo");

        imagen.setX(xFinal);
        imagen.setY(yFinal-40);
    }

    //Mueve la bicicleta y dibuja su recorrido
    //Recibe como parámetro solo la distancia
    //Avanza en la dirección que ya tenía
    private void mover(GraphicsContext gc, Bicicleta bicicleta, double distancia){
        double xInicial = 10+bicicleta.x;
        double yInicial = 400-bicicleta.y;

        bicicleta.avanzar(distancia);

        double xFinal = 10+bicicleta.x;
        double yFinal = 400-bicicleta.y;

        gc.strokeLine(xInicial, yInicial, xFinal, yFinal);
        System.out.println(bicicleta.x+" "+ bicicleta.y+"alo");

    }
    
}