package es.upvmaster.fullmediaplayer;

import android.content.Intent;
import android.content.res.Configuration;
import android.os.Environment;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

import java.io.File;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Vector;

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

public class ListarArchivos extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

    private Toolbar toolbar;
    private AdaptadorEntradaSistema adaptadorEntradas;
    private RecyclerView recyclerView;
    private RecyclerView.LayoutManager layoutManager;
    private String unidadActual;
    private File rutaActual;
    private Vector<EntradaSistemaArchivo> vectorEntradas;

    private MenuItem opcionPresionada = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_listar_archivos);

        vectorEntradas = new Vector<EntradaSistemaArchivo>();
        adaptadorEntradas = new AdaptadorEntradaSistema(ListarArchivos.this,vectorEntradas);
        unidadActual = Environment.getExternalStorageDirectory().getAbsolutePath();

        toolbar = (Toolbar) findViewById(R.id.toolbarArchivo);
        toolbar.setTitle(R.string.app_name_archivos);
        setSupportActionBar(toolbar);

        DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layoutArchivo);
        ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.drawer_open,R.string.drawer_close);
        drawerLayout.setDrawerListener(actionBarDrawerToggle);
        actionBarDrawerToggle.syncState();
        drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {
            @Override
            public void onDrawerSlide(View drawerView, float slideOffset) {
            }

            @Override
            public void onDrawerOpened(View drawerView) {
            }

            @Override
            public void onDrawerClosed(View drawerView) {
                if (opcionPresionada!=null) opcionPresionada.setChecked(false);
            }

            @Override
            public void onDrawerStateChanged(int newState) {

            }
        });

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        adaptadorEntradas.setOnItemClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AdaptadorEntradaSistema.ViewHolder viewHolder = (AdaptadorEntradaSistema.ViewHolder) recyclerView.getChildViewHolder(v);
                EntradaSistemaArchivo entradaSistemaArchivo = vectorEntradas.get(viewHolder.getAdapterPosition());
                if (entradaSistemaArchivo.isDirectory()) {
                    if (entradaSistemaArchivo.getName().equals("..")) {
                        String[] componentes = rutaActual.getAbsolutePath().split("/");
                        String ultimoPath = "";
                        for (int i=1;i<componentes.length-1;i++) {
                            ultimoPath += "/" + componentes[i];
                        }
                        cargarEntradasSistemaArchivos(new File(ultimoPath));

                    } else {
                        cargarEntradasSistemaArchivos(new File(entradaSistemaArchivo.getPath()));
                    }
                } else {
                    File file = new File(entradaSistemaArchivo.getPath());
                    if (file.exists()) {
                        iniciarReproduccion(ListarArchivos.this,TipoMedio.LOCAL,entradaSistemaArchivo.getPath());
                    }
                }
            }
        });

        recyclerView = (RecyclerView) findViewById(R.id.recycler_view_lista_archivos);
        recyclerView.setAdapter(adaptadorEntradas);
        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
            layoutManager = new StaggeredGridLayoutManager(4,  StaggeredGridLayoutManager.VERTICAL);
        }
        else {
            layoutManager = new StaggeredGridLayoutManager(2,  StaggeredGridLayoutManager.VERTICAL);
        }
        layoutManager.setAutoMeasureEnabled(true);
        recyclerView.setLayoutManager(layoutManager);

        File Directorio = new File(unidadActual);
        if (Directorio.exists()) {
            try {
                cargarEntradasSistemaArchivos(Directorio);
            } catch (Exception e) {
                imprimirLog(TipoLog.ERROR,"Listar entradas",e.getMessage());
                mostrarMensaje(ListarArchivos.this,getResources().getString(R.string.no_puedes_acceder) + " " + unidadActual);
            }
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        Intent intent;
        opcionPresionada = item;
        switch (item.getItemId()) {
            case R.id.nav_listaMedio:
                intent = new Intent(ListarArchivos.this,ListarListas.class);
                startActivity(intent);
                break;
            case R.id.nav_localVideo:
                intent = new Intent(ListarArchivos.this,ListarVideos.class);
                startActivity(intent);
                break;
            case R.id.nav_localAudio:
                intent = new Intent(ListarArchivos.this,ListarAudios.class);
                startActivity(intent);
                break;
            case R.id.nav_archivoMedio:
                File Directorio = new File(unidadActual);
                if (Directorio.exists()) {
                    try {
                        cargarEntradasSistemaArchivos(Directorio);
                    } catch (Exception e) {
                        imprimirLog(TipoLog.ERROR,"Listar entradas",e.getMessage());
                        mostrarMensaje(ListarArchivos.this,getResources().getString(R.string.no_puedes_acceder) + " " + unidadActual);
                    }
                }
                break;
            case R.id.nav_urlMedio:
                intent = new Intent(ListarArchivos.this,AccederMedioURL.class);
                startActivity(intent);
                break;
            case R.id.nav_preferencias:
                Intent intentPref = new Intent(this, Preferencias.class);
                startActivity(intentPref);
                break;
            case R.id.nav_salir:
                Intent intentSalir = new Intent(Intent.ACTION_MAIN);
                intentSalir.addCategory(Intent.CATEGORY_HOME);
                intentSalir.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intentSalir);
        }

        DrawerLayout drawerLayout = (DrawerLayout) findViewById( R.id.drawer_layoutArchivo);
        drawerLayout.closeDrawer(GravityCompat.START);
        return true;
    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawerLayout = (DrawerLayout) findViewById( R.id.drawer_layoutArchivo);
        if (drawerLayout.isDrawerOpen(GravityCompat.START))
        {
            drawerLayout.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    private void cargarEntradasSistemaArchivos(File Directorio) {
        EntradaSistemaArchivo entradaSistemaArchivo;
        rutaActual = Directorio;
        toolbar.setTitle(rutaActual.getAbsolutePath());
        File[] entradasDirectorio =  null;

        vectorEntradas.clear();

        if (Directorio.canRead())
            entradasDirectorio = Directorio.listFiles();
        if (entradasDirectorio!=null) {
            Arrays.sort(entradasDirectorio, new Comparator<File>() {
                @Override
                public int compare(File f1, File f2) {
                    return f1.getName().compareToIgnoreCase(f2.getName());
                }
            });

            Vector<EntradaSistemaArchivo> directorios = new Vector<EntradaSistemaArchivo>();
            Vector<EntradaSistemaArchivo> archivos = new Vector<EntradaSistemaArchivo>();

            for (int i=0;i<entradasDirectorio.length;i++) {
                if (entradasDirectorio[i].getName().equals(".android_secure")) continue;
                if (entradasDirectorio[i].isDirectory()) {
                    entradaSistemaArchivo = new EntradaSistemaArchivo(entradasDirectorio[i].getName(), entradasDirectorio[i].getAbsolutePath(), true, false, false);
                    directorios.add(entradaSistemaArchivo);
                } else if (entradasDirectorio[i].isFile()) {
                    if (esFicheroValido(ArchivosValidos.MUSICA,entradasDirectorio[i])) {
                        entradaSistemaArchivo = new EntradaSistemaArchivo(entradasDirectorio[i].getName(), entradasDirectorio[i].getAbsolutePath(), false, true, false);
                        archivos.add(entradaSistemaArchivo);
                    } else if (esFicheroValido(ArchivosValidos.VIDEO,entradasDirectorio[i])) {
                        entradaSistemaArchivo = new EntradaSistemaArchivo(entradasDirectorio[i].getName(), entradasDirectorio[i].getAbsolutePath(), false, false, true);
                        archivos.add(entradaSistemaArchivo);
                    }
                } else continue;
            }

            if (directorios.size()>0) {
                vectorEntradas.addAll(directorios);
            }
            if (archivos.size()>0) {
                vectorEntradas.addAll(archivos);
            }

        } else {
            mostrarMensaje(ListarArchivos.this,getResources().getString(R.string.carpeta_vacia));
        }

        if (!Directorio.getAbsolutePath().equals(unidadActual)) {
            entradaSistemaArchivo = new EntradaSistemaArchivo("..","",true,false,false);
            vectorEntradas.add(0,entradaSistemaArchivo);
        }

        adaptadorEntradas.notifyDataSetChanged();

    }

    private boolean esFicheroValido(ArchivosValidos tipo,File fichero) {
        String[] extensionesValidas = null;
        if (tipo == ArchivosValidos.MUSICA)
            extensionesValidas = extensionesMusica;
        else
            extensionesValidas = extensionesVideo;

        for (int i=0; i< extensionesValidas.length; i++)
            if (fichero.getName().toLowerCase().contains(extensionesValidas[i])) return true;
        return false;
    }
}