package com.virtual.pollentia.WalkingTour.vista;


/**
 * Created by Roger Gomez
 */

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.PopupMenu.OnMenuItemClickListener;
import android.widget.TextView;
import android.widget.Toast;

import com.virtual.pollentia.WalkingTour.controlador.Controlador;
import com.virtual.pollentia.pollentia_tour.R;


public class MainActivity extends ActionBarActivity implements SensorEventListener, OnMenuItemClickListener {

    //variables globales
    private Controlador controlador;
    private ImageView image;
    private float currentDegree = 0f;
    private TextView texto;
    private Button inicial;
    private Button info;
    private Button play;
    private SensorManager mSensorManager;
    private int estadoPlay = 0;
    private int rotateImage=0;

    // device sensor manager
    private SensorManager sensor;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //recogemos todos los elementos de la vista
        play = (Button) findViewById(R.id.play_tour);


        texto = (TextView) findViewById(R.id.instructionView);
        texto.setText("");

        inicial = (Button) findViewById(R.id.botonInicial);
        info = (Button) findViewById(R.id.botonInfo);
        //escondemos los botones de info i siguente
        inicial.setVisibility(View.GONE);
        info.setVisibility(View.GONE);

        //recogemos el sensor de  movimiento
        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

        //recogemos la imagen
        image = (ImageView) findViewById(R.id.brujula);


        controlador = controlador.getSingletonInstance(this, texto);

        //listener del boton play

        play.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if (estadoPlay == 0) {
                    controlador.puntoCercano();

                } else {
                    controlador.pararNuevaRuta();
                    estadoPlay = 0;
                    texto.setText("");
                    play.setText("INICIAR EL TOUR");
                    inicial.setEnabled(true);
                    inicial.setVisibility(View.GONE);
                    info.setVisibility(View.GONE);
                    mSensorManager.unregisterListener(MainActivity.this);

                }
                image.setImageResource(R.drawable.flecha);
            }
        });

        //listener del boton de ir al siguiente punto
        inicial.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                inicial.setEnabled(false);
                mSensorManager.registerListener(MainActivity.this, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
                        SensorManager.SENSOR_DELAY_GAME);
                info.setVisibility(View.GONE);
                controlador.iniciarNuevaRuta();
            }
        });


        //listener del boton de ifo
        info.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                PopupMenu popupMenu = new PopupMenu(MainActivity.this, v);
                popupMenu.setOnMenuItemClickListener(MainActivity.this);
                popupMenu.inflate(R.menu.popup_menu_media);

                //comprovamos que info existe para mostrar la opcion de ver ese tipo de info o no
                if (!controlador.videoExist()) {
                    popupMenu.getMenu().findItem(R.id.item_videos).setVisible(false);
                }
                if (!controlador.photoExist()) {
                    popupMenu.getMenu().findItem(R.id.item_photos).setVisible(false);
                }
                if (!controlador.textExist()) {
                    popupMenu.getMenu().findItem(R.id.item_textos).setVisible(false);
                }
                if (!controlador.Audioexist() && !controlador.photoExist()) {
                    popupMenu.getMenu().findItem(R.id.item_audios).setVisible(false);
                }
                popupMenu.show();
            }
        });


    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main_activity_actions, menu);
        return super.onCreateOptionsMenu(menu);
        //return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle presses on the action bar items
        switch (item.getItemId()) {
            case R.id.action_maps:
                if (controlador.isConnectingToInternet(this)) {
                    Intent i = new Intent(MainActivity.this, MapsActivity.class);
                    startActivity(i);
                    this.overridePendingTransition(R.anim.push_down_in, R.anim.push_down_out);
                } else {
                    AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);

                    // Titulo del Alert
                    alertDialog.setTitle("Internet");

                    // Mensaje del Alert
                    alertDialog.setMessage("Parece ser que no tienes conexion a Internet");

                    // Setting's Button
                    alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {

                        }
                    });
                    alertDialog.show();
                }

                return true;

            case R.id.action_settings:
                if (estadoPlay == 0) {
                    Intent i = new Intent(MainActivity.this, Preferences.class);
                    startActivity(i);
                } else {
                    Toast.makeText(this, "Tienes una ruta en marcha",
                            Toast.LENGTH_SHORT).show();
                }
                return true;

            default:
                return super.onOptionsItemSelected(item);
        }
    }

    /**
     * Recogemos el tipo de info que a eligido ver
     * @param item el elemento que ha seleccionado
     * @return
     */

    public boolean onMenuItemClick(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.item_videos:
                controlador.openVideoFile();
                return true;
            case R.id.item_textos:
                Intent i = new Intent(MainActivity.this, Text.class);
                startActivity(i);
                this.overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
                return true;
            case R.id.item_photos:
                Intent j = new Intent(MainActivity.this, FullScreenViewActivity.class);
                startActivity(j);
                this.overridePendingTransition(R.anim.zoom_out, R.anim.zoom_out);
                return true;
            case R.id.item_audios:
                Intent k = new Intent(MainActivity.this, FullScreenViewActivity.class);
                startActivity(k);
                this.overridePendingTransition(R.anim.zoom_out, R.anim.zoom_out);
                controlador.openAudio();
                return true;
            default:
                return false;
        }
    }

    /**
     * Parar el sensor
     */
    public void unregisterSensor(){
        mSensorManager.unregisterListener(this);
    }

    /**
     * Al pulsar el botón de atras en el dispositivo finalizamos la activity
     */
    @Override
    public void onBackPressed() {

        unregisterSensor();
        controlador.destruirControlador();
        controlador = null;
        this.finish();

    }

    //funcion que no se utiliza para rotar la imagen pero se deja para futuras mejoras
   /* public void setRotateImage(int i){
        rotateImage=i;
    }*/

    /**
     * Recoge el movimiento del dispositivo, la direccion al siguiente punto que le da el controlador i rota la imagen para indicar la direccion donde tenemos que ir
     * @param event
     */
    @Override
    public void onSensorChanged(SensorEvent event) {

        float degree = Math.round(event.values[0]);
        RotateAnimation ra=null;

        float newDegree=controlador.getGrados();

        if(newDegree<0){
            newDegree+=360;
        }
        ra = new RotateAnimation(
                currentDegree,
                newDegree-degree,
                Animation.RELATIVE_TO_SELF, 0.5f,
                Animation.RELATIVE_TO_SELF,
                0.5f);

        // how long the animation will take place
        ra.setDuration(210);

        // set the animation after the end of the reservation status
        ra.setFillAfter(true);

        // Start the animation
        image.startAnimation(ra);
        currentDegree = newDegree-degree;

    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // not in use
    }

    /**
     * funcion que utiliza el controlador para cambiar el estado entre 0 i 1, apagado i encendido
     * @param estado
     */
    public void setEstado(int estado) {
        estadoPlay = estado;
    }


}
