package com.example.reproductordelistasmultimedia;

import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;


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

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;

public class ListaVideosLocal extends ListActivity {

    // String JSON
    private String jsonStr;
    // Nodes JSON
    private static final String TAG_USER = "user";
    private static final String TAG_TITLE = "title";
    private static final String TAG_ID = "id";
    private static final String TAG_DESCRIPTION = "description";
    private static final String TAG_VIDEOURL = "videoUrl";
    private static final String TAG_CATEGORY = "category";
    // Para la reproducción
    private static String enlace, enlace1;
    // Lista de imágenes
    int[] flags = new int[]{
            R.drawable.gremlins,
            R.drawable.evildead2013,
            R.drawable.escapefromnewyork,
            R.drawable.manofsteel,
            R.drawable.carrie,
            R.drawable.armyofdarkness,
            R.drawable.planetoftheapes68,
            R.drawable.therockyhorror,
            R.drawable.cabinofthewoods,
            R.drawable.bbb,
    };

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

        // Inicializamos variable
        jsonStr = loadJSONFromResource(this, R.raw.listavideos);

        // Ejecutamos GetVideos
        new GetVideos().execute();
    }

    /*
     Clase de AsyncTask para conseguir JSON con llamadas HTTP
     */
    private class GetVideos extends AsyncTask<Void, Void, Void> {

        // Hashmap del ListView
        ArrayList<HashMap<String, String>> videosList;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... arg0) {

            Log.d("Response: ", "> " + jsonStr);

            videosList = ParseJSON(jsonStr);

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            //Insertando datos JSON en el ListView
            ListAdapter adapter = new SimpleAdapter(
                    ListaVideosLocal.this, videosList,
                    R.layout.list_item1, new String[]{TAG_TITLE, TAG_DESCRIPTION,
                    TAG_CATEGORY, TAG_ID}, new int[]{R.id.title,
                    R.id.description, R.id.category, R.id.imagenurl});

            setListAdapter(adapter);

        }

    }

    private ArrayList<HashMap<String, String>> ParseJSON(String json) {
        if (json != null) {
            try {
                // Hashmap del ListView
                ArrayList<HashMap<String, String>> videoList = new ArrayList<HashMap<String, String>>();

                JSONObject jsonObj = new JSONObject(json);

                // Array de Nodes JSON
                JSONArray videos = jsonObj.getJSONArray(TAG_USER);

                // Buscando en todos los vídeos
                for (int i = 0; i < videos.length(); i++) {
                    JSONObject c = videos.getJSONObject(i);

                    String nombre = c.getString(TAG_TITLE);
                    String descripcion = c.getString(TAG_DESCRIPTION);
                    String categoria = c.getString(TAG_CATEGORY);
                    // String correspondiente al enlace para reproducir el vídeo
                    enlace = c.getString(TAG_VIDEOURL);

                    // Hashmap para un único vídeo
                    HashMap<String, String> video = new HashMap<String, String>();

                    // Añadiendo nodes JSON según llave-valor
                    video.put(TAG_TITLE, nombre);
                    video.put(TAG_ID, Integer.toString(flags[i]));
                    video.put(TAG_DESCRIPTION, descripcion);
                    video.put(TAG_CATEGORY, categoria);
                    video.put(TAG_VIDEOURL, enlace);

                    // Añadiendo vídeo a la lista
                    videoList.add(video);
                }
                return videoList;
            } catch (JSONException e) {
                e.printStackTrace();
                return null;
            }
        } else {
            Log.e("Manejador de Servicio", "No se puede obtener datos de la url");
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    @Override
    public void onListItemClick(ListView listView, View view, int position, long id)
    {
        super.onListItemClick (listView, view, position, id);

        HashMap<String, String> map = (HashMap<String, String>) getListView().getItemAtPosition(position);

        if (compruebaConexion(this)==false)
            {
                Toast.makeText(this, "No hay acceso a internet para mostar el vídeo por streaming.", Toast.LENGTH_SHORT).show();
            }
            else {
                Intent intent = new Intent(this, Videoplayer_local.class);
                intent.putExtra("Video", map.get(TAG_VIDEOURL));
                enlace1 = intent.getExtras().getString("Video");
                Toast.makeText(this, "Selección: Vídeo nº " + Integer.toString(position + 1), Toast.LENGTH_LONG).show();
                this.startActivity(intent);
        }
    }

    // Método para establecer el enlace en la clase Videoplayer
    public static String setEnlaceLocal(){
        Log.d("Videoplayer_local", "setEnlaceLocal");
        return enlace1;
    }

    public static String loadJSONFromResource(Context context, int resource ){
        if( resource <= 0 ) return null;
        String json = null;
        InputStream is = context.getResources().openRawResource( resource );
        try { if( is != null ) { int size = is.available();
            byte[] buffer = new byte[size];
            is.read(buffer);
            json = new String(buffer, "UTF-8");
        }
        }
        catch( IOException e ) { } finally { try { if( is != null ) is.close(); }
        catch( IOException e ) {} } return json;
    }

    // Función para comprobar la conexión
    public static boolean compruebaConexion(Context context) {
        boolean connected = false;
        ConnectivityManager connec = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        // Recupera todas las redes (tanto móviles como wifi)
        NetworkInfo[] redes = connec.getAllNetworkInfo();
        for (int i = 0; i < redes.length; i++) {
            // Si alguna red tiene conexión, se devuelve true
            if (redes[i].getState() == NetworkInfo.State.CONNECTED) {
                connected = true;
            }
        }
        return connected;
    }

}






