package com.pchef.cc.personalchef;

import android.content.Intent;
import android.os.Handler;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.google.gson.JsonElement;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import ai.api.android.AIConfiguration;
import ai.api.android.AIService;
import ai.api.model.AIError;
import ai.api.model.AIResponse;
import ai.api.model.Result;
import ai.api.ui.AIDialog;

public class Home extends AppCompatActivity {
    boolean doubleBackToExitPressedOnce= false;
    private EditText ip;
    //private FloatingActionButton add;
    private RecyclerView rv;
    Button go,add;
    private AIService aiService;

    private List<String> iList = new ArrayList<>();
    InputAdapter mAdapter;
    //EditText
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        ip = (EditText) findViewById(R.id.input);
        add = (Button) findViewById(R.id.add);
        rv = (RecyclerView) findViewById(R.id.list);
        rv.setLayoutManager(new LinearLayoutManager(this));
        rv.setItemAnimator(new DefaultItemAnimator());

        go = (Button) findViewById(R.id.go);
        rv.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));

        mAdapter = new InputAdapter(iList, this);

        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                aiService.startListening();

            }
        });


        go.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (iList.size() != 0) {
                    StringBuilder sb = new StringBuilder("");
                    for (int i = 0; i < iList.size(); i++) {
                        sb.append(iList.get(i));
                        sb.append("+");
                    }
                    String str = sb.toString();
                    Intent intent = new Intent(Home.this, MainActivity.class);
                    intent.putExtra("str", str);
                    startActivity(intent);
                } else {
                    Toast.makeText(Home.this, "Please Add Atleast One Ingredient", Toast.LENGTH_SHORT).show();
                }

            }
        });
        ip.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                String i = ip.getText().toString().trim();
                if (!i.equals("")) {
                    if (!iList.contains(i)) {
                        iList.add(i);
                        mAdapter.notifyDataSetChanged();
                        rv.setAdapter(mAdapter);
                        ip.setText("");
                        ip.requestFocus();
                    }
                }
                return false;
            }
        });


        final AIConfiguration config = new AIConfiguration("54b8a1cfad6e4a7e870d33d8cc732a73",
                AIConfiguration.SupportedLanguages.English,
                AIConfiguration.RecognitionEngine.System);
        /*AIDialog aiDialog = new AIDialog(this, config);
        aiDialog.setResultsListener(new AIClass(Home.this));
        aiDialog.showAndListen();*/
        aiService = AIService.getService(this, config);
        aiService.setListener(new ai.api.AIListener() {
            @Override
            public void onResult(AIResponse response) {

                Result result = response.getResult();

                // Get parameters
                String parameterString = "";
                if (result.getParameters() != null && !result.getParameters().isEmpty()) {
                    for (final Map.Entry<String, JsonElement> entry : result.getParameters().entrySet()) {
                        parameterString += "(" + entry.getKey() + ", " + entry.getValue() + ") ";
                    }
                }

                // Show results in TextView.

                if(!parameterString.equals(""))
                {
                    String ip = result.getResolvedQuery();
                    iList.add(ip);
                    mAdapter.notifyDataSetChanged();
                    rv.setAdapter(mAdapter);
                }


                String s = "Query:" + result.getResolvedQuery() +
                        "\nAction: " + result.getAction()+
                        "\nparams" + parameterString;

                Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show();
                /*resultTextView.setText("Query:" + result.getResolvedQuery() +
                        "\nAction: " + result.getAction() +
                        "\nParameters: " + parameterString);*/
            }

            @Override
            public void onError(final AIError error) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(Home.this, error.toString(), Toast.LENGTH_SHORT).show();
                    }
                });
            }

            @Override
            public void onAudioLevel(float level) {

            }

            @Override
            public void onListeningStarted() {
                Toast.makeText(Home.this, "Started", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onListeningCanceled() {

            }

            @Override
            public void onListeningFinished() {

            }
        });
    }


    @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);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_feedback) {
            startActivity(new Intent(Home.this,Feedback.class));
            return true;
        }
        if (id == R.id.action_about) {
            startActivity(new Intent(Home.this,AboutUs.class));
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onBackPressed() {



        if (doubleBackToExitPressedOnce) {
            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_HOME);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
            finish();
            super.onBackPressed();
            return;
        }
        this.doubleBackToExitPressedOnce = true;
        Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();

        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                doubleBackToExitPressedOnce = false;
            }
        }, 2000);
    }





}