package helios.helios;

import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Typeface;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Vibrator;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class RunningActivity extends AppCompatActivity{

    public TextView TextView_imagenes_running, TextView_angulo_barrido_running, TextView_velocidad_running, TextView_intervalo_running;
    public String   String_Imagenes, String_Angulo, String_Velocidad, String_Intervalo;
    public int      int_imagenes, int_angulo, int_velocidad, int_intervalo, Captura;
    public Button   button_iniciar, button_cancelar;

    private CountDownTimer  countDownTimer;
    private TextView        TextView_reloj;
    private long            Duracion;
    private boolean         timerRunning;

    @Override
    protected void onCreate(Bundle savedInstanceState){

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_running);

        // Inicializa los TextView
        TextView_imagenes_running =       (TextView) findViewById(R.id.TextView_cantidad_imagenes_running);
        TextView_angulo_barrido_running = (TextView) findViewById(R.id.TextView_angulo_barrido_running);
        TextView_velocidad_running =      (TextView) findViewById(R.id.TextView_velocidad_running);
        TextView_intervalo_running =      (TextView) findViewById(R.id.TextView_intervalo_running);
        TextView_reloj =                  (TextView) findViewById(R.id.TextView_reloj);

        // Inicializa los Buttons
        button_cancelar = (Button) findViewById(R.id.button_cancelar);
        button_iniciar =  (Button) findViewById(R.id.button_iniciar);

        // Cambia la tipografía del reloj
        Typeface face = Typeface.createFromAsset(getAssets(),"fonts/Digit.TTF");
        TextView_reloj.setTypeface(face);

        // Recibe los datos desde activity_main.xml
        String_Velocidad = getIntent().getStringExtra("Velocidad");
        String_Intervalo = getIntent().getStringExtra("Intervalo");
        String_Imagenes =  getIntent().getStringExtra("Imagenes");
        String_Angulo =    getIntent().getStringExtra("Angulo");

        // Escribe los datos en activity_main_running.xml
        TextView_imagenes_running.setText(String_Imagenes);
        TextView_angulo_barrido_running.setText(String_Angulo);
        TextView_velocidad_running.setText(String_Velocidad);
        TextView_intervalo_running.setText(String_Intervalo);

        // Convierte los valores String_x a int_x
        int_imagenes =  Integer.valueOf(String_Imagenes);
        int_angulo =    Integer.valueOf(String_Angulo);
        int_velocidad = Integer.valueOf(String_Velocidad);
        int_intervalo = Integer.valueOf(String_Intervalo);

        // Imágenes capturadas
        Captura = 0;
        Duracion = int_imagenes * int_intervalo * 1000;
        updateTimer();

        // Inicia y/o pausa la actividad
        button_iniciar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startStop();
            }
        });

        // Crea el dialogo que se muestra al pulsar "Cancelar"
        final AlertDialog.Builder dialogo1 = new AlertDialog.Builder(this);
        dialogo1.setTitle("Importante");
        dialogo1.setMessage("¿Desea cancelar la ejecución?");
        dialogo1.setCancelable(false);

        dialogo1.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialogo1, int id) {
                stopTimer();
                finish();
            }
        });
        dialogo1.setPositiveButton("Continuar", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialogo1, int id) {
                // Si pulsa continuar, no hace nada
            }
        });

        // Cancela la actividad y vuelve atrás
        button_cancelar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(timerRunning) {
                    dialogo1.show();
                }else{
                    finish();
                    if(timerRunning)
                        stopTimer();
                }
            }
        });

    }

    @Override   // Sobreescribe el botón "Atrás" nativo de android
    public void onBackPressed() {

    }

    // Inicia/Reanuda o pausa la ejecución
    public void startStop(){
        if(timerRunning){
            stopTimer();
        }else{
            startTimer();
        }
    }

    // Método para iniciar o reanudar el reloj
    public void startTimer(){

        countDownTimer = new CountDownTimer(Duracion, 1000){

            @Override
            public void onTick(long l){
                Duracion = l;
                updateTimer();
            }

            @Override
            public void onFinish(){
                timerRunning = false;
                button_iniciar.setVisibility(View.INVISIBLE);
                button_cancelar.setText("Volver");

                // Muestra un mensaje de finalizado con éxito
                Toast aviso = Toast.makeText(getApplicationContext(), "Proceso finalizado con éxito.", Toast.LENGTH_SHORT);
                aviso.show();
                // Reproduce el sonido
                Sonido();
                // Vibra el teléfono
                Vibrador(1500);
            }

        }.start();

        button_iniciar.setText("Pausar");
        timerRunning = true;
    }

    // Pausa el reloj
    public void stopTimer(){
        countDownTimer.cancel();
        button_iniciar.setText("Reanudar");
        timerRunning = false;
    }

    // Método para iniciar el vibrador
    public void Vibrador( int tiempo ){
        final Vibrator vibrator = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE);
        assert vibrator != null;
        vibrator.vibrate(tiempo);
    }

    // Método para iniciar el sonido
    public void Sonido(){
        MediaPlayer mp = MediaPlayer.create(this,R.raw.alerta);
        mp.start();
    }

    // Actualiza el reloj en pantalla
    public void updateTimer(){

        long Horas = (int) Duracion / 3600000;
        long Minutos = (int) Duracion / 60000;
        long Segundos = (int) Duracion % 60000 / 1000;

        if( (int)Segundos % int_intervalo == 0 && timerRunning ){
            Captura += 1;
            EnviarSeñalCaptura();
        }

        String String_Captura = "" + Captura + "/" + int_imagenes;
        String TiempoRestante;

        while ( Segundos >= 60 && Segundos >= 0 ){
            Segundos -= 60;
            Minutos += 1;
        };

        while( Minutos >= 60 && Minutos >= 0 ){
            Minutos -= 60;
            Horas += 1;
        };

        if( Horas < 10 )
            TiempoRestante = "0" + Horas + ":";
        else
            TiempoRestante = "" + Horas + ":";

        if( Minutos < 10 )
            TiempoRestante += "0" + Minutos + ":";
        else
            TiempoRestante += "" + Minutos + ":";

        if ( Segundos < 10 )
            TiempoRestante += "0" + Segundos;
        else
            TiempoRestante += "" + Segundos;

        TextView_reloj.setText(TiempoRestante);
        TextView_imagenes_running.setText(String_Captura);
    }

    public void  EnviarSeñalCaptura(){
        // Aquí enviamos la señal de captura de imagen por bluetooth
    }
}

