package com.example.gestion_absences_eleves;

import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import static android.view.View.GONE;

public class Interface_saisie_eleve extends AppCompatActivity  {

    private static final int CODE_GET_REQUEST = 1024;
    private static final int CODE_POST_REQUEST = 1025;

    EditText editTextNiveauId;
    EditText editTextGroupId;
    EditText editTextMatiereId;

   // ListView list_niveau_eleve;
    Spinner list_niveau_eleve, list_matiere_absence, list_groupe_eleve;
    TextView date_absence_matiere;
    ProgressBar progressBar;
    //Pour afficher les absences ajoutées, modifiées, etc
    ListView list_absences;

    EditText cne_eleve;
    EditText heure_debut_absence, heure_fin_absence, remarques_absence;

   // List<Niveaux> niveauList;

    String ServerGroupURL = "http://gestionabsenceeleve.com/gestion_absences_mobile/select_groupe.php";
    String ServerNiveauURL = "http://gestionabsenceeleve.com/gestion_absences_mobile/select_niveau.php";
    String ServerMatiereAbsURL = "http://gestionabsenceeleve.com/gestion_absences_mobile/select_matiere_absence.php";

    //we will use this list to display absences in listview
    List<Absence> absenceList;

    //as the same button is used for create and update
    //we need to track whether it is an update or create operation
    //for this we have this boolean
    boolean isUpdating = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_interface_saisie_eleve);

        editTextNiveauId = (EditText) findViewById(R.id.id_niveau);
        editTextGroupId = (EditText) findViewById(R.id.id_group);
        editTextMatiereId = (EditText) findViewById(R.id.id_matiere_absence);

        cne_eleve = (EditText) findViewById(R.id.cne_eleve);

        SimpleDateFormat date_today = new SimpleDateFormat("dd/MM/YYYY HH:mm:ss");
        date_absence_matiere = (TextView) ( findViewById(R.id.date_absence) );
        Calendar la_date_absence = Calendar.getInstance();
        date_absence_matiere.setText(date_today.format(la_date_absence.getTime()));

        //list_niveau_eleve = (Spinner)findViewById(R.id.list_niveau_eleve);
        list_niveau_eleve = (Spinner) findViewById(R.id.list_niveau_eleve);
        list_groupe_eleve = (Spinner) findViewById(R.id.list_groupe_eleve);
        list_matiere_absence = (Spinner) findViewById(R.id.list_matiere);


        //Cette progressBar joue un double rôle: Pour afficher les listes niveau_eleve, group, etc
        // Et pour afficher les absences ajoutées, modifiées, etc
        progressBar = (ProgressBar) findViewById(R.id.progressBar);

        list_absences = (ListView) findViewById(R.id.listViewAbsences);

        new GetHttpResponse(Interface_saisie_eleve.this).execute();

        Button btn_ajoute_absence = (Button) findViewById(R.id.btn_ajoute_absence);
        // Add a OnClickListener object to button
        btn_ajoute_absence.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent Interface_saisie_eleve = new Intent(getApplicationContext(), Interface_saisie_eleve.class);
                startActivity(Interface_saisie_eleve);
            }
        });

        Button btn_chercher_absence = (Button) findViewById(R.id.btn_chercher_absence);
        // Add a OnClickListener object to button
        btn_chercher_absence.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent chercher_absence = new Intent(getApplicationContext(), Interface_chercher_absence.class);
                startActivity(chercher_absence);
            }
        });

        //Pour ajouter, afficher, modifier la liste des absences
        Button btn_enregistrer_absence = (Button) findViewById(R.id.btn_enregistrer_absence);

        absenceList = new ArrayList<>();


        btn_enregistrer_absence.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //if it is updating
               /* if (isUpdating) {
                    //calling the method update absence
                    //method is commented because it is not yet created
                    //updateHero();
                } else {
                    //if it is not updating
                    //that means it is creating
                    //so calling the method create absence

                }
            }
            */
               createAbsence();
            }
        });

        //calling the method read absences to read existing absences from the database
        //method is commented because it is not yet created
        //readAbsences();

    }

    //Pour créer une absence
    private void createAbsence() {

        String id_eleve = cne_eleve.getText().toString().trim();

        // String  id_niveau_eleve = editTextNiveauId.getText().toString();
        //String id_group_eleve = list_groupe_eleve.getSelectedItem().toString();
        // String id_group_eleve = editTextGroupId.getText().toString();

        String id_matiere_eleve = list_matiere_absence.getSelectedItem().toString();

        String date_absence_abs = date_absence_matiere.toString();

        SimpleDateFormat formatter5 = new SimpleDateFormat("E, dd/MM/YYYY HH:mm:ss");

        try {
            Date date_absence = formatter5.parse(date_absence_abs);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        heure_debut_absence = (EditText) findViewById(R.id.debut_heure_absence);
        heure_fin_absence = (EditText) findViewById(R.id.debut_heure_absence);
        remarques_absence = (EditText) findViewById(R.id.remarques_absence);

        //validating the inputs
        if (TextUtils.isEmpty(id_eleve) || id_eleve.equals("Saisir CNE élève")) {
            cne_eleve.setError("Merci de saisir le CNE de l'élève");
            cne_eleve.requestFocus();
            return;
        }

        String id_eleve_absence = "Test100";
        int id_niveau_absence = 3;
        int id_groupe_absence = 2;
        int id_matiere_absence = 5;
        String date_absence_eleve = "2019-05-31 03:08:06";
        String heure_debut_absence_eleve = "08:30";
        String heure_fin_absence_eleve = "10:00";
        String remarques_absence_eleve = "Tester Les Remarques";

        //if validation passes
        HashMap<String, String> params = new HashMap<>();
        params.put("id_eleve", id_eleve_absence);
        params.put("id_niveau", String.valueOf(id_niveau_absence));
        params.put("id_group", String.valueOf(id_groupe_absence));
        params.put("id_matiere", String.valueOf(id_matiere_absence));
        params.put("date_absence", date_absence_eleve);
        params.put("heure_debut_absence", heure_debut_absence_eleve);
        params.put("heure_fin_absence", heure_fin_absence_eleve);
        params.put("remarques_absence", remarques_absence_eleve);

        //Calling the create Absence API
        PerformNetworkRequest request = new PerformNetworkRequest(Api.URL_CREATE_ABSENCE, params, CODE_POST_REQUEST);
        request.execute();
    }

    private class GetHttpResponse extends AsyncTask<Void, Void, Void> {
        public Context context;

        String ResultHolder;
        List<Groups> groupeList;
        List<Niveaux> niveauList;
        List<MatiereAbsence> matiereList;

        public GetHttpResponse(Context context) {
            this.context = context;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... arg0) {
            HttpServicesClass httpServiceObject = new HttpServicesClass(ServerGroupURL);
            HttpServicesClass httpServiceNiveauObject = new HttpServicesClass(ServerNiveauURL);
            HttpServicesClass httpServiceMatiereObject = new HttpServicesClass(ServerMatiereAbsURL);

            //Try Globale de toutes les opérations, exécutions pour récupérer les groupes de classes d'élèves
            try {
                httpServiceObject.ExecutePostRequest();

                if (httpServiceObject.getResponseCode() == 200) {
                    ResultHolder = httpServiceObject.getResponse();

                    if (ResultHolder != null) {
                        JSONArray jsonArray = null;
                        //Data or not
                        try {
                            jsonArray = new JSONArray(ResultHolder);

                            JSONObject jsonObject;
                            Groups group;
                            groupeList = new ArrayList<Groups>();

                            for (int i = 0; i < jsonArray.length(); i++) {
                                group = new Groups();
                                jsonObject = jsonArray.getJSONObject(i);
                                group.NomGroupe = jsonObject.getString("nom_group");
                                //  group.idGroupe = jsonObject.getInt("id_group");

                                groupeList.add(group);
                            }
                        } catch (JSONException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                } else {
                    Toast.makeText(context, httpServiceObject.getErrorMessage(), Toast.LENGTH_LONG).show();
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            //Try Globale de toutes les opérations, exécutions pour récupérer les niveaux d'élèves de la BD
            try {
                httpServiceNiveauObject.ExecutePostRequest();

                if (httpServiceNiveauObject.getResponseCode() == 200) {
                    ResultHolder = httpServiceNiveauObject.getResponse();

                    if (ResultHolder != null) {
                        JSONArray jsonArray = null;
                        //Data or not
                        try {
                            jsonArray = new JSONArray(ResultHolder);

                            JSONObject jsonObject;
                            Niveaux niveau;
                            niveauList = new ArrayList<Niveaux>();

                            for (int i = 0; i < jsonArray.length(); i++) {
                                niveau = new Niveaux();
                                jsonObject = jsonArray.getJSONObject(i);
                                niveau.NomNiveau = jsonObject.getString("nom_niveau");
                                // niveau.id_niveau_eleve = jsonObject.getInt("id_niveau");
                                niveauList.add(niveau);
                            }
                        } catch (JSONException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                } else {
                    Toast.makeText(context, httpServiceObject.getErrorMessage(), Toast.LENGTH_SHORT).show();
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            //Try Globale de toutes les opérations, exécutions pour récupérer les matières enseignées de la BD
            try {
                httpServiceMatiereObject.ExecutePostRequest();

                if (httpServiceMatiereObject.getResponseCode() == 200) {
                    ResultHolder = httpServiceMatiereObject.getResponse();
                    if (ResultHolder != null) {
                        JSONArray jsonArray = null;
                        //Data or not
                        try {
                            jsonArray = new JSONArray(ResultHolder);

                            JSONObject jsonObject;
                            MatiereAbsence matiere;
                            matiereList = new ArrayList<MatiereAbsence>();

                            for (int i = 0; i < jsonArray.length(); i++) {
                                matiere = new MatiereAbsence();
                                jsonObject = jsonArray.getJSONObject(i);
                                matiere.MatiereAbsence = jsonObject.getString("nom_matiere");
                                matiereList.add(matiere);
                            }
                        } catch (JSONException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                } else {
                    Toast.makeText(context, httpServiceObject.getErrorMessage(), Toast.LENGTH_SHORT).show();
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            progressBar.setVisibility(GONE);
            list_groupe_eleve.setVisibility(View.VISIBLE);
            list_niveau_eleve.setVisibility(View.VISIBLE);
            list_matiere_absence.setVisibility(View.VISIBLE);

            if (niveauList != null) {

                ListAdapterNiveauClass adapter = new ListAdapterNiveauClass(niveauList, context);
                list_niveau_eleve.setAdapter(adapter);
            }

            if (groupeList != null) {
                ListAdapterClass adapter = new ListAdapterClass(groupeList, context);
                list_groupe_eleve.setAdapter(adapter);
            }

            if (matiereList != null) {
                ListAdapterMatiereAbsClass adapter = new ListAdapterMatiereAbsClass(matiereList, context);
                list_matiere_absence.setAdapter(adapter);
            }
        }

    }

    //inner class to perform network request extending an AsyncTask
    private class PerformNetworkRequest extends AsyncTask<Void, Void, String> {

        //the url where we need to send the request
        String url;

        //the parameters
        HashMap<String, String> params;

        //the request code to define whether it is a GET or POST
        int requestCode;

        //constructor to initialize values
        PerformNetworkRequest(String url, HashMap<String, String> params, int requestCode) {
            this.url = url;
            this.params = params;
            this.requestCode = requestCode;
        }

        //when the task started displaying a progressbar
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressBar.setVisibility(View.VISIBLE);
        }


        //this method will give the response from the request
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            //  progressBar.setVisibility(GONE);
            try {
                JSONObject object = new JSONObject(s);
                if (!object.getBoolean("error")) {
                    Toast.makeText(getApplicationContext(), object.getString("message"), Toast.LENGTH_SHORT).show();
                    //refreshing the absencelist after every operation
                    //so we get an updated list
                    //we will create this method right now it is commented
                    //because we haven't created it yet
                    //refreshHeroList(object.getJSONArray("absences"));
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        //the network operation will be performed in background
        @Override
        protected String doInBackground(Void... voids) {
            RequestHandler requestHandler = new RequestHandler();

            if (requestCode == CODE_POST_REQUEST)
                return requestHandler.sendPostRequest(url, params);


            if (requestCode == CODE_GET_REQUEST)
                return requestHandler.sendGetRequest(url);

            return null;
        }
    }

}
