package edu.uoc.prezmm.a1list2cook;

import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.JsonHttpResponseHandler;
import com.loopj.android.http.RequestParams;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;

import cz.msebera.android.httpclient.Header;
import edu.uoc.prezmm.a1list2cook.objects_class.Lists;
import edu.uoc.prezmm.a1list2cook.objects_class.Users;

public class ListsListActivity extends BaseActivity {

    private ArrayList<Lists> listsArrayList;
    private ArrayList<String> ingredientsCont;

    private ListsListActivity.ListsAdapter adapter;
    private ListView listsList;

    private String userCode;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //Defineix el contingut del layout de la Activity dins el frame de la classe pare
        setLayoutToBaseFrame(R.layout.activity_lists_list);

        //Estableix el títol
        setToolBarTitle("Llistes de compra");

        //Estableix el esdeveniment onClick al botó flotant
        FloatingActionButton listsAdd = (FloatingActionButton)findViewById(R.id.listAdd);
        listsAdd.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                changeActivity(ListAddActivity.class);
            }
        });

        //Inicialització de les variables
        listsArrayList = new ArrayList<Lists>();
        ingredientsCont = new ArrayList<String>();

        //Recupera la informació necessaria de l'usuari
        SharedPreferences prefs = getSharedPreferences("UserInfo", Context.MODE_PRIVATE);
        Users userInfo = new Users(prefs);
        userCode = userInfo.getUserCode();

        //Inicialitza l'array amb el ListView
        adapter = new ListsListActivity.ListsAdapter(this);
        listsList = (ListView)findViewById(R.id.listsList);

        //Crida a la funció per recuperar les llistes
        getLists(userCode);
    }

    //Recupera les llistes de compra
    private void getLists(String userCode) {
        //Parametres per passar al WebService
        RequestParams params = new RequestParams();
        params.put("userCode", userCode);

        //Missatge mentre s'està executant el procés de validació
        final ProgressDialog progressDialog = new ProgressDialog(this);

        //Creació de la connecció amb el WebService
        AsyncHttpClient client = new AsyncHttpClient();
        client.get("http://1list2cook.com/webservices/lists_list.php", params, new JsonHttpResponseHandler() {
            @Override
            public void onStart() {
                progressDialog.setMessage("Recuperant llistes...");
                progressDialog.show();
            }

            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                progressDialog.dismiss();
                try {
                    JSONObject jsonArray = new JSONObject(response.toString());
                    if (jsonArray.get("success").toString().equalsIgnoreCase("1")) {
                        JSONArray userInfo = new JSONArray(jsonArray.get("message").toString());

                        //Guardar info per generar un nou objecte
                        for(int i = 0; i < userInfo.length(); i++) {
                            String listIden = userInfo.getJSONObject(i).get("listIden").toString();
                            String listTitl = userInfo.getJSONObject(i).get("listTitle").toString();
                            String listCont = userInfo.getJSONObject(i).get("listCont").toString();

                            //Crea el nou objecte amb la informació de la llista
                            Lists listInfo = new Lists(listIden, listTitl);

                            //Introdueix la recepta a l'array
                            listToArray(listInfo);

                            //Esepecifica el contador a la variable
                            contToArray(listCont);
                        }

                        //Vincula l'array amb el ListView
                        listsList.setAdapter(adapter);

                    } else {
                        showMessage(jsonArray.get("message").toString());
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, String res, Throwable t) {
                progressDialog.dismiss();
                showMessage("No s'ha pogut gestionar l'operació, intenta-ho de nou. Disculpa les molèsties.");
            }
        });
    }

    //Afegeix una llista a l'array de llistes
    private void listToArray(Lists list) {
        listsArrayList.add(list);
    }

    //Afegeix un contador a l'array de contadors
    private void contToArray(String cont) {
        ingredientsCont.add(cont);
    }

    //Constructor de la classe per l'adaptador
    class ListsAdapter extends ArrayAdapter<Lists> {
        AppCompatActivity appCompatActivity;

        ListsAdapter(AppCompatActivity context) {
            super(context, R.layout.view_list, listsArrayList);
            appCompatActivity = context;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = appCompatActivity.getLayoutInflater();
            View item = inflater.inflate(R.layout.view_list, null);

            //Declaració dels elements del View
            LinearLayout listInfo = (LinearLayout)item.findViewById(R.id.listInfo);
            TextView titleText = (TextView)item.findViewById(R.id.titleText);
            TextView ingredientsText = (TextView)item.findViewById(R.id.ingredientsText);
            Button deleteButton = (Button)item.findViewById(R.id.deleteButton);

            //Valors dels elements de l'array
            final int idList = listsArrayList.get(position).getCode();
            String titleList = listsArrayList.get(position).getName();

            //Omple els elements del View
            titleText.setText(titleList);
            ingredientsText.setText("Ingredients: " + ingredientsCont.get(position));

            //Event onClick, canvia a Activity de detall de la recepta, passa com a paràmetre el ID de la recepta
            listInfo.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    changeActivity(ListDetailActivity.class,"idList",String.valueOf(idList));
                }
            });

            //Event onClick que recarrega el Activity passant com a paràmetre el ID de la categoria
            deleteButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    deleteList(String.valueOf(idList));
                }
            });

            return(item);
        }
    }

    //Eliminar llista
    private void deleteList(final String listCode) {
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(ListsListActivity.this);

        //Títol del Dialog
        alertDialog.setTitle("Eliminar llista");

        //Missatge del Dialog
        alertDialog.setMessage("Estàs segur de què vols eliminar la llista? Si acceptes, serà esborrada permanentment.");

        //Botó per acceptar l'operació
        alertDialog.setPositiveButton("Acceptar", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
               //Parametres per passar al WebService
                RequestParams params = new RequestParams();
                params.put("listCode", listCode);

                //Missatge mentre s'està executant el procés de validació
                final ProgressDialog progressDialog = new ProgressDialog(ListsListActivity.this);

                //Creació de la connexió amb el WebService
                AsyncHttpClient client = new AsyncHttpClient();
                client.get("http://1list2cook.com/webservices/list_delete.php", params, new JsonHttpResponseHandler() {
                    @Override
                    public void onStart() {
                        progressDialog.setMessage("Eliminant llista...");
                        progressDialog.show();
                    }
                    @Override
                    public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                        progressDialog.dismiss();
                        try {
                            JSONObject jsonArray = new JSONObject(response.toString());
                            if (jsonArray.get("success").toString().equalsIgnoreCase("1")) {
                                showMessage(jsonArray.get("message").toString());
                                changeActivity(ListsListActivity.class);
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                    @Override
                    public void onFailure(int statusCode, Header[] headers, String res, Throwable t) {
                        progressDialog.dismiss();
                        showMessage("No s'ha pogut gestionar l'operació, intenta-ho de nou. Disculpa les molèsties.");
                    }
                });
            }
        });

        //Botó per cancel·lar l'operació
        alertDialog.setNegativeButton("Cancel·lar", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                //showMessage("NO OK");
            }
        });

        //Mostra el Dialog
        alertDialog.show();
    }
}
