package edu.uoc.prezmm.a1list2cook;

import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable;
import android.support.design.widget.FloatingActionButton;
import android.os.Bundle;
import android.support.v4.content.res.ResourcesCompat;
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.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;

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;

public class ListDetailActivity extends BaseActivity {

    private ArrayList<Lists> listArrayList;
    private ArrayList<Ingredients> ingredientsArrayList;
    private String listCode;


    private ListDetailActivity.ListAdapter adapterList;
    private ListView listList;

    private LinearLayout ingredientsLayout;
    private LinearLayout ingredientsCheckedLayout;

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

        //Recupera el valor del Extra
        Intent intent = getIntent();
        listCode = intent.getStringExtra("idList");

        //Inicialitzar arrays necessaris
        listArrayList = new ArrayList<Lists>();
        ingredientsArrayList = new ArrayList<Ingredients>();

        //Inicialitza l'array amb el ListView
        adapterList = new ListDetailActivity.ListAdapter(this);
        listList = (ListView)findViewById(R.id.listView);

        //Crida a la funció per recuperar les llistes
        getList(listCode);
    }

    //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) { ingredientsArrayList.add(ingredient); }

    //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);

                            //Canvia el títol del ToolBar
                            setToolBarTitle(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ó de la recepta
    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
                    listList.setAdapter(adapterList);
                } 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.");
            }
        });
    }

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

        ListAdapter(AppCompatActivity context) {
            super(context, R.layout.view_list_detail, listArrayList);
            appCompatActivity = context;
        }

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

            //Declaració dels elements del View
            ImageButton shareButton = (ImageButton)item.findViewById(R.id.shareList);
            ingredientsLayout = (LinearLayout)item.findViewById(R.id.ingredientsList);
            ingredientsCheckedLayout = (LinearLayout)item.findViewById(R.id.ingredientsCheckedList);
            FloatingActionButton editButton = (FloatingActionButton)findViewById(R.id.editButton);

            //Valors dels elements de l'array
            final String idList = String.valueOf(listArrayList.get(position).getCode());

            //Per cada Ingredient genera un botó
            for(int i = 0; i < ingredientsArrayList.size(); i++) {
                //Genera el nou botó amb les carateristiques desitjades
                final Button ingrButt = new Button(ListDetailActivity.this);
                String ingredientQuantity = ingredientsArrayList.get(i).getQuantity();
                if(ingredientQuantity.isEmpty()) ingredientQuantity = "1";

                //Especifica la tipografia utilitzada
                Typeface typeFace = ResourcesCompat.getFont(ListDetailActivity.this, R.font.font_montserrat_regular);
                ingrButt.setTypeface(typeFace);

                //Especifica la informació del ingredient
                ingrButt.setText(ingredientsArrayList.get(i).getName() + " (" + ingredientQuantity + ")");
                ingrButt.setId(ingredientsArrayList.get(i).getCode());

                //Especifica els marges de cada botó
                final LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                        LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT
                );
                params.setMargins(0, 10, 0, 10);

                //Crida a la funció per especificar un estil al botó i l'envia al layout corresponent en funció del seu estat
                ingredientSetState(ingrButt,ingredientsArrayList.get(i).getStat(),params);

                //Afegeix funcionalitat al botó
                ingrButt.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        ingredientChangeState(ingrButt,params);
                    }
                });
            }

            //Event onClick per compartir la llista actual
            shareButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    shareList();
                }
            });

            //Event onClick que envia al Activity d'edició passant com a paràmetre el ID de la llista
            editButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    changeActivity(ListAddActivity.class,"idList",String.valueOf(idList));
                }
            });

            return(item);
        }
    }

    //Especifica un estil al botó en funció de l'estat de l'ingredient
    private void ingredientSetState(Button ingrButt,String stat, LinearLayout.LayoutParams params) {
        if(stat.equals("1")) {
            //Estils producte no comprat
            ingredientsCheckedLayout.removeView(ingrButt);
            ingrButt.setBackgroundColor(getResources().getColor(R.color.colorButtonUnpressed));
            ingrButt.setTextColor(Color.parseColor("#333333"));
            ingrButt.setTextSize(18);
            ingrButt.setPaintFlags(ingrButt.getPaintFlags() & (~ Paint.STRIKE_THRU_TEXT_FLAG));
            ingredientsLayout.addView(ingrButt, params);
        } else {
            //Estils producte comprat
            ingredientsLayout.removeView(ingrButt);
            ingrButt.setBackgroundColor(getResources().getColor(R.color.colorButtonPressed));
            ingrButt.setTextColor(Color.parseColor("#aaaaaa"));
            ingrButt.setTextSize(16);
            ingrButt.setPaintFlags(ingrButt.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
            ingredientsCheckedLayout.addView(ingrButt, params);
        }
    }

    //Canvia y desa a la base de dades el nou estat del ingredient
    private void ingredientChangeState(Button ingrButt,LinearLayout.LayoutParams params) {
        //Recupera el color de fons del botó per establir un nou stat al botó
        ColorDrawable buttonColor = (ColorDrawable) ingrButt.getBackground();
        int colorId = buttonColor.getColor();
        String newStat = (colorId == getResources().getColor(R.color.colorButtonUnpressed)) ? "0" : "1";
        ingredientSetState(ingrButt,newStat,params);

        //Guardar nou estat a la base de dades
        saveStat(String.valueOf(ingrButt.getId()),newStat);
    }

    //Mostra la finestra per compartir contingut
    private void shareList(){
        Intent sendIntent = new Intent();

        String text = "Llista de la compra\n" + listArrayList.get(0).getName().toString()+ "\n\n";
        text += "Productes: \n";
        for(int i = 0;i < ingredientsArrayList.size();i++) {
            text += ingredientsArrayList.get(i).getName() + ": " + ingredientsArrayList.get(i).getQuantity() + "\n";
        }
        sendIntent.setAction(Intent.ACTION_SEND);
        sendIntent.putExtra(Intent.EXTRA_TEXT, text);
        sendIntent.setType("text/plain");
        startActivity(sendIntent);
    }

    //Canvia l'estat del l'ingredient de la llista
    private void saveStat(String ingrCode,String ingrStat) {
        //Parametres per passar al WebService
        RequestParams params = new RequestParams();
        params.put("ingrCode", ingrCode);
        params.put("ingrStat", ingrStat);

        //Creació de la connexió amb el WebService
        AsyncHttpClient client = new AsyncHttpClient();
        client.get("http://1list2cook.com/webservices/ingredient_stat.php", params, new JsonHttpResponseHandler() {

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