package es.upvmaster.fullmediaplayer;

import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
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 org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Calendar;

import static es.upvmaster.fullmediaplayer.Libreria.*;

public class CrearListasMedios extends AppCompatActivity {
    private AdaptadorMedios adaptadorMedios;
    private ListaMedios nuevaLista;
    private TextView nombreMedio;
    private TextView autorMedio;
    private RecyclerView recyclerView;
    private RecyclerView.LayoutManager layoutManager;
    private int indiceLista;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_crear_listas_medios);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AlertDialog dialogoNuevoMedio = crearDialogoNuevoMedio();
                dialogoNuevoMedio.show();
            }
        });

        nombreMedio = (TextView) findViewById(R.id.nombre_medio);
        autorMedio = (TextView) findViewById(R.id.autor_medio);


        nuevaLista = new ListaMedios();
        Calendar fechaActual = Calendar.getInstance();
        String identificador = Integer.toString(fechaActual.get(Calendar.YEAR)) +
                Integer.toString(fechaActual.get(Calendar.MONTH)+1) +
                Integer.toString(fechaActual.get(Calendar.DAY_OF_MONTH)) +
                Integer.toString(fechaActual.get(Calendar.HOUR)) +
                Integer.toString(fechaActual.get(Calendar.MINUTE)) +
                Integer.toString(fechaActual.get(Calendar.SECOND)) ;
        nuevaLista.setNameFile("LOC_" + identificador + ".w3u");
        nuevaLista.setName("");
        nuevaLista.setAuthor("");

        adaptadorMedios = new AdaptadorMedios(getApplicationContext(),nuevaLista.getStations());
        adaptadorMedios.setOnItemClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AdaptadorMedios.ViewHolder viewHolder = (AdaptadorMedios.ViewHolder) recyclerView.getChildViewHolder(view);
                indiceLista = viewHolder.getAdapterPosition();
                AlertDialog dialogo = crearDialogoEliminar();
                dialogo.show();
            }
        });

        recyclerView = (RecyclerView) findViewById(R.id.recycler_view_lista_medios);
        recyclerView.setAdapter(adaptadorMedios);
        layoutManager = new StaggeredGridLayoutManager(2,  StaggeredGridLayoutManager.VERTICAL);
        layoutManager.setAutoMeasureEnabled(true);
        recyclerView.setLayoutManager(layoutManager);

        AlertDialog dialogoListaNueva = crearDialogoNuevaLista();
        dialogoListaNueva.show();
    }

    @Override
    public void onBackPressed() {
        AlertDialog confirmarSalir = crearDialogoSalir();
        confirmarSalir.show();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_crear_listas_medios, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
            case R.id.menu_guardarListaMedios:
                new GuardarLista().execute();
                break;
            case R.id.menu_anularListaMedios:
                salir(RESULT_CANCELED);
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    private void salir(int resultado) {
        setResult(resultado,null);
        finish();
    }

    private AlertDialog crearDialogoNuevaLista() {
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);

        LayoutInflater inflater = this.getLayoutInflater();

        View v = inflater.inflate(R.layout.dialog_lista_nueva, null);
        final EditText nombreLista = (EditText) v.findViewById(R.id.nombre_lista);
        final EditText autorLista = (EditText) v.findViewById(R.id.autor_lista);
        Button botonAceptar = (Button) v.findViewById(R.id.boton_aceptar);
        Button botonCancelar = (Button) v.findViewById(R.id.boton_cancelar);

        builder.setView(v);
        final AlertDialog alertDialog = builder.create();
        alertDialog.setCancelable(false);

        botonAceptar.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        alertDialog.dismiss();
                        String nombre = nombreLista.getText().toString().trim();
                        String autor = autorLista.getText().toString().trim();
                        if (nombre.length()<0) {
                            mostrarMensaje(CrearListasMedios.this,getResources().getString(R.string.nombre_lista_vacio));
                            salir(RESULT_CANCELED);
                        } else {
                            nombreMedio.setText(" " + nombre);
                            nuevaLista.setName(nombre);
                            autorMedio.setText(" " + autor);
                            nuevaLista.setAuthor(autor);
                        }

                    }
                }
        );

        botonCancelar.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        alertDialog.dismiss();
                        salir(RESULT_CANCELED);
                    }
                }

        );


        return alertDialog;
    }

    private AlertDialog crearDialogoNuevoMedio() {
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);

        LayoutInflater inflater = this.getLayoutInflater();

        View v = inflater.inflate(R.layout.dialog_medio_nuevo, null);
        final EditText nombreMedio = (EditText) v.findViewById(R.id.nombre_medio);
        final EditText urlMedio = (EditText) v.findViewById(R.id.url_medio);
        final EditText urlImagen = (EditText) v.findViewById(R.id.url_imagen);
        Button botonAceptar = (Button) v.findViewById(R.id.boton_aceptar);
        Button botonCancelar = (Button) v.findViewById(R.id.boton_cancelar);

        builder.setView(v);
        final AlertDialog alertDialog = builder.create();
        alertDialog.setCancelable(false);

        botonAceptar.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        alertDialog.dismiss();
                        String nombre = nombreMedio.getText().toString().trim();
                        String url = urlMedio.getText().toString().trim();
                        String image = urlImagen.getText().toString().trim();
                        if (nombre.length()<0 || url.length()<0) {
                            mostrarMensaje(CrearListasMedios.this,getResources().getString(R.string.datos_no_validos));
                        } else {
                            new CrearMedio(nombre,url,image).execute();
                        }

                    }
                }
        );

        botonCancelar.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        alertDialog.dismiss();
                    }
                }

        );


        return alertDialog;
    }

    private AlertDialog crearDialogoEliminar() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        builder.setTitle(getResources().getString(R.string.eliminar_medio))
                .setMessage(getResources().getString(R.string.estas_seguro_eliminar))
                .setPositiveButton(getResources().getString(R.string.si),
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                nuevaLista.eliminarMedio(indiceLista);
                                adaptadorMedios.notifyDataSetChanged();
                            }
                        })
                .setNegativeButton(getResources().getString(R.string.no),
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {

                            }
                        });

        return builder.create();
    }

    private AlertDialog crearDialogoSalir() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        builder.setTitle(getResources().getString(R.string.guardar_lista))
                .setMessage(getResources().getString(R.string.guardar_lista_confirmar))
                .setPositiveButton(getResources().getString(R.string.si),
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                new GuardarLista().execute();
                            }
                        })
                .setNegativeButton(getResources().getString(R.string.no),
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                salir(RESULT_CANCELED);
                            }
                        });

        return builder.create();
    }

    class CrearMedio extends AsyncTask<Void, Void, Void> {
        private ProgressDialog pDialog;
        private Medio nuevoMedio;

        public CrearMedio(String nombreMedio, String urlMedio, String urlImagen) {
            nuevoMedio = new Medio();
            nuevoMedio.setName(nombreMedio);
            nuevoMedio.setUrl(urlMedio);
            nuevoMedio.setImage(urlImagen);
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(CrearListasMedios.this);
            pDialog.setMessage(getResources().getString(R.string.creando_medio));
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        @Override
        protected Void doInBackground(Void... arg0) {
            if (nuevoMedio.getImage().length()>0) guardarImagenURL(nuevoMedio.getImage());
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            if (pDialog.isShowing()){
                pDialog.dismiss();
            }
            nuevaLista.agregarMedio(nuevoMedio);
            adaptadorMedios.notifyDataSetChanged();
        }
    }

    class GuardarLista extends AsyncTask<Void, Void, Boolean> {
        private ProgressDialog pDialog;

        public GuardarLista() {}

        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(CrearListasMedios.this);
            pDialog.setMessage(getResources().getString(R.string.guardando_lista));
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        @Override
        protected Boolean doInBackground(Void... arg0) {
            if (nuevaLista.mediosCargados()) return guardarLista();
            return false;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            super.onPostExecute(result);
            if (pDialog.isShowing()){
                pDialog.dismiss();
            }
            if (result) salir(RESULT_OK);
            else salir(RESULT_CANCELED);
        }

        private boolean guardarLista () {
            boolean result = false;
            JSONObject jsonLista= new JSONObject();
            JSONArray jsonStations = new JSONArray();
            JSONObject jsonStation = null;

            try {
                jsonLista.put("name", nuevaLista.getName());
                jsonLista.put("author",nuevaLista.getAuthor());
                jsonLista.put("url",nuevaLista.getUrl());
                jsonLista.put("parental",nuevaLista.getParental());
                jsonLista.put("info",nuevaLista.getInfo());
                for (int i=0;i<nuevaLista.getStations().size();i++) {
                    jsonStation = new JSONObject();
                    jsonStation.put("name",nuevaLista.getStations().get(i).getName());
                    jsonStation.put("image",nuevaLista.getStations().get(i).getImage());
                    jsonStation.put("url",nuevaLista.getStations().get(i).getUrl());
                    jsonStation.put("ishost",nuevaLista.getStations().get(i).getIshost());
                    jsonStation.put("referer",nuevaLista.getStations().get(i).getReferer());
                    jsonStations.put(jsonStation);
                }
                jsonLista.put("stations",jsonStations);

                OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(InfoGlobal.getINSTANCIA().getDirectorio() + File.separator + nuevaLista.getNameFile()));
                outputStreamWriter.write(jsonLista.toString());
                outputStreamWriter.flush();
                outputStreamWriter.close();
                result = true;

            } catch (IOException e) {
                imprimirLog(TipoLog.ERROR,"Guardar lista IO",e.getMessage());
            } catch (JSONException e) {
                imprimirLog(TipoLog.ERROR,"Guardar lista JSON",e.getMessage());
            }
            return result;
        }
    }

}
