package com.virtual.tour.arquelogia.vista;

/**
 * Created by Roger Gomez
 */

import android.app.AlertDialog;
import android.content.Context;
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.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.PopupMenu.OnMenuItemClickListener;
import android.widget.TextView;
import android.widget.Toast;

import com.virtual.tour.arquelogia.controlador.Controlador;
import com.virtual.tour.arquelogia.R;


public class MainActivity extends ActionBarActivity implements SensorEventListener, OnMenuItemClickListener {

    //Variables Globales
    private Controlador controlador;
    private ImageView image;
    private float currentDegree = 0f;
    private SensorManager sensor;
    TextView tvHeading;
    private int estado = 0;
    private ImageButton botonEmpezar;
    private ImageButton botonGuardar;
    private ImageButton botonImportante;
    private EditText texto;
    private boolean inicial = true;
    private Context contexto;
    private int animation_duration = 210;


    /**
     * Función que se ejecuta al crear la activity.
     *
     * @param savedInstanceState
     */

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


        tvHeading = (TextView) findViewById(R.id.editText2);
        image = (ImageView) findViewById(R.id.imageView);
        botonEmpezar = (ImageButton) findViewById(R.id.botonEmpezar);
        botonGuardar = (ImageButton) findViewById(R.id.botonGuardar);
        botonImportante = (ImageButton) findViewById(R.id.botonImportante);
        texto = (EditText) findViewById(R.id.editText);

        contexto = this;
        sensor = (SensorManager) getSystemService(SENSOR_SERVICE);

        LayoutInflater li = LayoutInflater.from(this);
        View promptsView = li.inflate(R.layout.guardar, null);

        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                this);

        // set guardar.xml al alertdialog
        alertDialogBuilder.setView(promptsView);

        /*crea el controlador e inicializa el gps*/
        controlador = controlador.getSingletonInstance(texto, botonGuardar, botonEmpezar, botonImportante, sensor, this);

        //comprueba si la base de datos esta llena para activar o desactivar el botón de guardar
        if (!controlador.bdLlena()) {
            botonGuardar.setEnabled(false);
        } else {
            botonGuardar.setImageResource(R.drawable.guardar_azul);
        }

        botonImportante.setEnabled(false);

        //actvamos los listeners
        activarListeners();

    }


    /**
     * iflate del menú de opciones.
     *
     * @param menu
     * @return
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    /**
     * Funcíon para detectar la opción pulsada del menu de opciones y realizar la acción correspondiente.
     *
     * @param item
     * @return
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();

        switch (id) {
            case R.id.action_settings:
                if (estado == 0) {
                    if (controlador.bdLlena()) {
                        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);
                        alertDialogBuilder.setMessage(R.string.eliminar_bd);

                        alertDialogBuilder.setNegativeButton(R.string.cancelar,
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                        dialog.cancel();
                                    }
                                }).setPositiveButton(R.string.eliminar, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface arg0, int arg1) {
                                controlador.delBd();
                                botonGuardar.setEnabled(false);
                                botonGuardar.setImageResource(R.drawable.guardar);
                                Toast.makeText(contexto, R.string.ruta_eliminada,
                                        Toast.LENGTH_SHORT).show();
                            }
                        });
                        AlertDialog alertDialog = alertDialogBuilder.create();
                        alertDialog.show();

                    } else {
                        Toast.makeText(contexto, R.string.ruta_vacia,
                                Toast.LENGTH_SHORT).show();
                    }
                } else {
                    Toast.makeText(contexto, R.string.ruta_marcha,
                            Toast.LENGTH_SHORT).show();
                }
                return true;

            case R.id.explorador:
                if (estado == 0) {
                    Intent i = new Intent(MainActivity.this, ExplorerFiles.class);
                    startActivity(i);
                } else {
                    Toast.makeText(contexto, R.string.ruta_marcha,
                            Toast.LENGTH_SHORT).show();
                }
                return true;

            case R.id.preferences:
                if (estado == 0) {
                    Intent i = new Intent(MainActivity.this, Preferences.class);
                    startActivity(i);
                } else {
                    Toast.makeText(contexto, R.string.ruta_marcha,
                            Toast.LENGTH_SHORT).show();
                }
                return true;

            case R.id.Maps:
                if (estado == 0) {
                    if (controlador.bdLlena()) {
                        if (controlador.isConnectingToInternet(this)) {
                            Intent i = new Intent(MainActivity.this, Maps.class);
                            startActivity(i);
                        } 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();
                        }

                    } else {
                        Toast.makeText(contexto, R.string.ruta_no_mostrar,
                                Toast.LENGTH_SHORT).show();
                    }
                } else {
                    Toast.makeText(contexto, R.string.ruta_marcha,
                            Toast.LENGTH_SHORT).show();
                }
                return true;

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

    /**
     * Función que nos indica que tipo de opción de guardado hemos elegido y  llama a la funcion pedirNombre con la opción correspondiente.
     *
     * @param item
     * @return
     */
    public boolean onMenuItemClick(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_raw:
                controlador.pedirNombre(1,this);
                return true;
            case R.id.menu_media:
                controlador.pedirNombre(2,this);
                return true;
            case R.id.menu_mediana:
                controlador.pedirNombre(3,this);
                return true;
            default:
                return false;
        }
    }

    /**
     * Al pulsar el boton de atras, cerramos el controlador y las acciones que este realizando, deactivamos el listener del sensor de rotación
     * y finalizamos la activity.
     */
    public void onBackPressed() {
        controlador.pararNuevaRuta();
        sensor.unregisterListener(this);
        controlador = null;
        finish();
    }

    /**
     * Función que detecta el cambio del sensor de rotación y crea la animación indicando el norte.
     *
     * @param event
     */

    @Override
    public void onSensorChanged(SensorEvent event) {

        // cogemos el angulo alrededor de el eje de las z donde se rotó
        float degree = Math.round(event.values[0]);
        controlador.setGrados(degree);

        tvHeading.setText(contexto.getString(R.string.grados) + Float.toString(degree));

        // creamos la animación de rotación
        RotateAnimation ra = new RotateAnimation(
                currentDegree,
                -degree,
                Animation.RELATIVE_TO_SELF, 0.5f,
                Animation.RELATIVE_TO_SELF,
                0.5f);

        // duracion de la animacion
        ra.setDuration(this.animation_duration);

        // seteamos la animación
        ra.setFillAfter(true);

        // Start de la animación
        image.startAnimation(ra);
        currentDegree = -degree;

    }

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

    /**
     * Función que activa el listener de los botones de la activity y llama a la función que toque en cada caso.
     */

    private void activarListeners() {


        //Listener del boton de inicio y llamda a las acciones pertinentes
        botonEmpezar.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                if (estado == 0) {

                    if (inicial && controlador.bdLlena()) {

                        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(contexto);

                        // titulo del alert
                        alertDialogBuilder.setTitle(R.string.alert);

                        // mensaje del dialogo
                        alertDialogBuilder
                                .setMessage(R.string.ruta_no_guarda)
                                .setCancelable(false)
                                .setPositiveButton(R.string.si, new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {

                                        boton();
                                    }
                                })
                                .setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                        //cerramos el dialog
                                        dialog.cancel();
                                    }
                                });

                        // creamos el dialog
                        AlertDialog alertDialog = alertDialogBuilder.create();

                        // mostramos el dialog
                        alertDialog.show();
                    } else {
                        inicial = false;
                        boton();
                    }
                } else {
                    estado = 0;
                    sensor.unregisterListener(MainActivity.this);
                    controlador.pararNuevaRuta();
                    botonEmpezar.setImageResource(R.drawable.play);
                    if (controlador.bdLlena()) {
                        botonGuardar.setEnabled(true);
                        botonGuardar.setImageResource(R.drawable.guardar_azul);
                    }


                    botonImportante.setEnabled(false);
                    botonImportante.setImageResource(R.drawable.imp);
                    texto.setText("");
                    tvHeading.setText("");
                }
            }
        });

        //Listener del boton de guardado y llamda a las acciones pertinentes
        botonGuardar.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);
                popupMenu.show();
            }
        });

        //Listener del boton de punto importante y llamda a las acciones pertinentes
        botonImportante.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                controlador.pedirPuntoImportante();
                botonGuardar.setEnabled(false);
            }
        });
    }

    /**
     * Función que realiza las acciones y llamadas del boton de play.
     */

    private void boton() {
        boolean todoCorrecto = false;
        todoCorrecto = controlador.iniciarNuevaRuta();

        if (todoCorrecto) {
            estado = 1;
            sensor.registerListener(MainActivity.this, sensor.getDefaultSensor(Sensor.TYPE_ORIENTATION),
                    SensorManager.SENSOR_DELAY_GAME);


            botonEmpezar.setImageResource(R.drawable.stop);
            botonGuardar.setEnabled(false);
            botonGuardar.setImageResource(R.drawable.guardar);
            inicial = false;
        }
    }

    /**
     * Set del estado , para que la activity sepa en que estado nos encontramos
     *
     * @param i
     */
    public void setEstado(int i) {
        estado = i;
    }
}
