package edu.uoc.prezmm.a1list2cook;

import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListAdapter;
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.Ingredients;
import edu.uoc.prezmm.a1list2cook.objects_class.Lists;
import edu.uoc.prezmm.a1list2cook.objects_class.Users;

public class ListAddActivity extends BaseActivity {

    private ArrayList<Ingredients> ingredientsList;
    private ArrayList<Lists> listArrayList;
    private ListAddActivity.IngredientsAdapter ingredientsAdapter;
    private ListView ingredientsListView;

    private String listCode;

    @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_list_add);

        //Inicialitza paràmetres
        ingredientsList=new ArrayList<Ingredients>();

        //Vincula els ingredients i atribueix accions
        ingredientsListView=(ListView)findViewById(R.id.ingredientsList);
        ingredientsAdapter = new ListAddActivity.IngredientsAdapter(this);

        //Inicialitza a zero la variable
        listCode = "0";

        //Comprova si existeix el Extra idList
        Intent intent = getIntent();
        if(intent.hasExtra("idList")) {
            //Recupera el valor del Extra
            listCode = intent.getStringExtra("idList");

            //Canvia el títol del ToolBar
            setToolBarTitle("Editar llista de compra");

            //Inicialitza l'array que conte la informació de la llista
            listArrayList = new ArrayList<Lists>();

            //Crida a la funció per recuperar la llista
            getList(listCode);
        } else {
            //Canvia el títol del ToolBar
            setToolBarTitle("Nova llista de compra");

            //Omple l'array d'ingredeients
            ingredientsList.add(new Ingredients("0", "",""));

            //Vincula l'adapaptador amb la llista i l'adapta al seu contingut
            ingredientsListView.setAdapter(ingredientsAdapter);
            setListViewHeightBasedOnChildren(ingredientsListView);
        }
    }

    //Especifica la alçada del ListView segons els elements de l'array
    private static void setListViewHeightBasedOnChildren(ListView listView) {
        ListAdapter listAdapter = (ListAdapter) listView.getAdapter();
        if (listAdapter == null) {
            // pre-condition
            return;
        }

        int totalHeight = 0;
        for (int i = 0; i <listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);
            // listItem.measure(0, 0);
            listItem.measure(
                    View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                    View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
            totalHeight += listItem.getMeasuredHeight();
        }

        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight
                + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        listView.setLayoutParams(params);
    }

    //INGREDIENTS
    //Afegeix un ingredient al ListView
    public void addIngredient(View view) {
        ingredientsAdapter.add(new Ingredients("0","",""));
        setListViewHeightBasedOnChildren(ingredientsListView);
    }

    //Eliminar un ingredient al ListView
    private void deleteIngredient(Ingredients item) {
        ingredientsAdapter.remove(item);
        setListViewHeightBasedOnChildren(ingredientsListView);
    }

    //Mostra la finestra per afegir un ingredient
    private void showIngredientDialog(final Ingredients oldItem, final int index){
        final Dialog dialog=new Dialog(ListAddActivity.this);
        dialog.setContentView(R.layout.dialog_ingredient_add);
        TextView txtMessage=(TextView)dialog.findViewById(R.id.titleDialog);
        txtMessage.setText("Afegir producte");
        final TextView ingredientText=(TextView)dialog.findViewById(R.id.ingredientDialog);
        ingredientText.setHint("Producte");
        ingredientText.setText(oldItem.getName());
        final TextView quantityText=(TextView)dialog.findViewById(R.id.quantityDialog);
        quantityText.setText(oldItem.getQuantity());
        Button bt=(Button)dialog.findViewById(R.id.submitDialog);
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ingredientsList.set(index,new Ingredients(String.valueOf(oldItem.getCode()),ingredientText.getText().toString(),quantityText.getText().toString()));
                ingredientsAdapter.notifyDataSetChanged();
                dialog.dismiss();
            }
        });
        dialog.show();
    }

    //Classe adaptador de ingredients
    class IngredientsAdapter extends ArrayAdapter<Ingredients> {
        AppCompatActivity appCompatActivity;

        IngredientsAdapter(AppCompatActivity context) {
            super(context, R.layout.view_ingredient_add, ingredientsList);
            appCompatActivity = context;
        }

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

            //Declaració dels elements del View
            EditText nameText = (EditText) item.findViewById(R.id.nameIngredient);
            EditText quantityText = (EditText) item.findViewById(R.id.quantityIngredient);

            //Valors dels elements de l'array
            String nameIngredient = ingredientsList.get(position).getName();
            String nameQuantity = ingredientsList.get(position).getQuantity();

            //Omple els elements del View
            nameText.setText(nameIngredient);
            quantityText.setText(nameQuantity);

            //Modifica el Hint del camp perque mostri un altre missatge
            nameText.setHint("Producte");

            //Boto eliminar element
            Button ingredientDelete = (Button)item.findViewById(R.id.ingredientDelete);

            final int itemPosition = position;

            //Event onClick, mostra el Dialog
            nameText.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    showIngredientDialog(ingredientsList.get(itemPosition),itemPosition);
                }
            });
            quantityText.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    showIngredientDialog(ingredientsList.get(itemPosition),itemPosition);
                }
            });

            //Vinculació del event per eliminar un element
            ingredientDelete.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    deleteIngredient(ingredientsList.get(itemPosition));
                }
            });

            return (item);
        }
    }

    //Funció que guarda la informació de la llista
    public void saveList(View view) {
        //Parametres per passar al WebService
        RequestParams params = new RequestParams();

        //Recupera i passa com a paràmetre el codi de l'usuari
        SharedPreferences prefs = getSharedPreferences("UserInfo", Context.MODE_PRIVATE);
        Users userInfo = new Users(prefs);
        params.put("userCode", userInfo.getUserCode());
        if(!listCode.equals("0")) params.put("listCode", listCode);

        //Recupera els valors de cada camp
        EditText listTitl = (EditText)findViewById(R.id.nameList);

        params.put("listTitl",listTitl.getText());

        //Passa la informació dels ingredients per paràmetres
        for(int i = 0; i < ingredientsList.size(); i++) {
            if(!listCode.equals("0")) params.put("ingrCode[" + String.valueOf(i) + "]",ingredientsList.get(i).getCode());
            params.put("ingrName[" + String.valueOf(i) + "]",ingredientsList.get(i).getName());
            params.put("ingrQuan[" + String.valueOf(i) + "]",ingredientsList.get(i).getQuantity());
        }

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

        //Creació de la connexió amb el WebService
        AsyncHttpClient client = new AsyncHttpClient();
        if(listCode.equals("0")) {
            client.get("http://1list2cook.com/webservices/list_new.php", params, new JsonHttpResponseHandler() {
                @Override
                public void onStart() {
                    progressDialog.setMessage("Guardant llista...");
                    progressDialog.show();
                }

                @Override
                public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                    progressDialog.dismiss();
                    try {
                        JSONObject jsonArray = new JSONObject(response.toString());
                        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." + statusCode);
                }
            });
        } else {
            client.get("http://1list2cook.com/webservices/list_update.php", params, new JsonHttpResponseHandler() {
                @Override
                public void onStart() {
                    progressDialog.setMessage("Guardant llista...");
                    progressDialog.show();
                }

                @Override
                public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                    progressDialog.dismiss();
                    try {
                        JSONObject jsonArray = new JSONObject(response.toString());
                        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." + statusCode);
                }
            });
        }
    }


    //Recupera la informació de la llista
    private void getList(final String listCode) {
        //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(this);

        //Creació de la connexió amb el WebService
        AsyncHttpClient client = new AsyncHttpClient();
        client.get("http://1list2cook.com/webservices/list_info.php", params, new JsonHttpResponseHandler() {
            @Override
            public void onStart() {
                progressDialog.setMessage("Recuperant 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")) {
                        JSONArray userInfo = new JSONArray(jsonArray.get("message").toString());

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

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

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

                            //Vincula el títol de la llista
                            EditText listTitlEdit = (EditText)findViewById(R.id.nameList);
                            listTitlEdit.setText(listTitl);
                        }
                        getIngredients(listCode);

                    } 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.");
            }
        });
    }

    //Recupera la informació dels ingredients
    private void getIngredients(String listCode) {
        //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(this);

        //Creació de la connexió amb el WebService
        AsyncHttpClient client = new AsyncHttpClient();
        client.get("http://1list2cook.com/webservices/list_ingredients.php", params, new JsonHttpResponseHandler() {
            @Override
            public void onStart() {
                progressDialog.setMessage("Recuperant ingredients...");
                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 ingrIden = userInfo.getJSONObject(i).get("ingrIden").toString();
                            String ingrName = userInfo.getJSONObject(i).get("ingrName").toString();
                            String inliQuantity = userInfo.getJSONObject(i).get("inliQuantity").toString();
                            String inliStat = userInfo.getJSONObject(i).get("inliStat").toString();

                            //Crea el nou objecte amb la informació de la recepta
                            Ingredients ingrInfo = new Ingredients(ingrIden, ingrName, inliQuantity, inliStat);

                            //Introdueix la recepta a l'array
                            ingredientToArray(ingrInfo);
                        }

                    } else {
                        showMessage(jsonArray.get("message").toString());
                    }

                    //Vincula l'array amb el ListView
                    ingredientsListView.setAdapter(ingredientsAdapter);
                    setListViewHeightBasedOnChildren(ingredientsListView);
                } 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 recepta a l'array de llistes
    private void listToArray(Lists list) {
        listArrayList.add(list);
    }

    //Afegeix un ingredient a l'array de ingredients
    private void ingredientToArray(Ingredients ingredient) { ingredientsList.add(ingredient); }
}

