package com.tpandroid.fibonacci;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import static android.os.SystemClock.uptimeMillis;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    protected long time;

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

        findViewById(R.id.choice_java).setOnClickListener(this);
        findViewById(R.id.choice_jni).setOnClickListener(this);
        findViewById(R.id.choice_web).setOnClickListener(this);

    // Example of a call to a native method
    //TextView tv = (TextView) findViewById(R.id.sample_text);
    //tv.setText(stringFromJNI());
    }



    @Override
    public void onClick(View v) {
        time = uptimeMillis();
        EditText question = (EditText) findViewById(R.id.question);
        switch (v.getId())
        {
            case R.id.choice_java :
                if (!question.getText().toString().isEmpty())
                {
                    int number = Integer.valueOf(question.getText().toString());
                    playJava(number);
                }
                else
                {
                    questionIsEmpty();
                }
                break;
            case R.id.choice_jni :
                if (!question.getText().toString().isEmpty())
                {
                    int number = Integer.valueOf(question.getText().toString());
                    playJNI(number);
                }
                else
                {
                    questionIsEmpty();
                }
                break;
            case R.id.choice_web :
                if (!question.getText().toString().isEmpty())
                {
                    String number = question.getText().toString();
                    playWeb(number);
                }
                else
                {
                    questionIsEmpty();
                }
                break;
        }

    }


    private void questionIsEmpty()
    {
        Toast.makeText(this, getText(R.string.question_empty), Toast.LENGTH_LONG).show();
    }

    private void playJava(int number)
    {
        if (number <= 0)
        {
            display(0);
        }
        else if (number == 1)
        {
            display(1);
        }
        else
        {
            long val1 = 1;
            long val2 = 0;
            long temp = 0;
            for (int i = 2; i <= number; i++)
            {
                temp = val2 + val1;
                val2 = val1;
                val1 = temp;
            }
            display(temp);
        }
    }

    private void playJNI(int number)
    {
        long result = fibonacci(number);
        display(result);
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native int fibonacci(int number);

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

    private void playWeb(String number)
    {
        //Toast.makeText(getApplicationContext(), number, Toast.LENGTH_SHORT).show();
        try {

            AsyncTask<Void, Void, Integer> service = new WebService(this, number).execute();

            int result = service.get(10000, TimeUnit.MILLISECONDS);
            display(result);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            display(-1);
            e.printStackTrace();
        }
    }

    private void display(long answer)
    {
        TextView result = (TextView) findViewById(R.id.result_title);
        String title = getString(R.string.result_title);

        result.setText(title + " " + String.valueOf(answer));
        result.setVisibility(View.VISIBLE);

        long time_result = uptimeMillis() - time;
        TextView result_time = (TextView) findViewById(R.id.result_time);

        result_time.setText("L'opération a pris "+String.valueOf(time_result)+" ms");
        result_time.setVisibility(View.VISIBLE);
    }
}
