package com.example.unodtantos.appqueology2.controlador;

import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Build;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.example.unodtantos.appqueology2.R;
import com.example.unodtantos.appqueology2.modelo.Nodo;

import java.io.File;
import java.util.ArrayList;

import static com.example.unodtantos.appqueology2.R.color.azul;

/**
 * Created by unodtantos on 23/05/2015.
 */
public class AdapterDiarioExcavacion extends ArrayAdapter<Nodo> {

    /*--------------------------------------------------------------------------------------------*/

    // <editor-fold defaultstate="collapsed" desc="Atributos de Clase">

    private Activity context;
    private Controlador controlador;
    private String nombre_proyecto;
    private String nombre_ue_seleccionada;
    private Typeface font;
    private ArrayList<Nodo> nodos_ues;

    private LinearLayout lnly_selec;

    private TextView nom_ue_titulo;
    private TextView nom_ue;
    private TextView tipo_ue_titulo;
    private TextView tipo_ue;
    private TextView descripcion_titulo;
    private TextView descripcion;
    private TextView fecha_creacion_ue_titulo;
    private TextView fecha_creacion_ue;
    private TextView datacion_1_titulo;
    private TextView datacion_1;
    private TextView datacioin_2_titulo;
    private TextView datacion_2;
    private TextView foto_titulo;
    private ImageView foto;
    private TextView nombre_foto_titulo;
    private TextView nombre_foto;
    private TextView fecha_foto_titulo;
    private TextView fecha_foto;
    private TextView localizacion_gps_titulo;
    private TextView localizacion_gps;
    private ImageView img_f;

    // </editor-fold>

    /*--------------------------------------------------------------------------------------------*/

    // <editor-fold defaultstate="collapsed" desc="Constructor de la Clase">

    /**
     * Constructor de la clase.
     * @param context
     * @param nodos_ues
     * @param nombre_p
     * @param nombre_ue_selecc
     */
    public AdapterDiarioExcavacion(Activity context, ArrayList<Nodo> nodos_ues, String nombre_p, String nombre_ue_selecc) {
        super(context, R.layout.activity_adapter_diario_excavacion, nodos_ues);

        this.context = context;
        this.controlador = (Controlador) context.getApplicationContext();
        this.nodos_ues = nodos_ues;
        this.nombre_proyecto = nombre_p;
        this.nombre_ue_seleccionada = nombre_ue_selecc;
        this.font = Typeface.createFromAsset(context.getAssets(), "gloriahallelujah.ttf");
    }

    // </editor-fold>

    /*--------------------------------------------------------------------------------------------*/

    // <editor-fold defaultstate="collapsed" desc="View">

    /**
     * Método que infla el contexto padre con cada uno de los items que representa a cada una de las
     * UEs almacenadas en la base de datos correspondiente.
     * @param posicion
     * @param view
     * @param parent
     * @return
     */
    public View getView(int posicion, View view, ViewGroup parent) {

        LayoutInflater inflater = context.getLayoutInflater();
        View item = inflater.inflate(R.layout.activity_adapter_diario_excavacion, null);

        inicializacion(item);
        aspectoInicial(posicion, item);
        cargarValores(posicion);
        capturarEventos(item, posicion);

        return item;
    }

    // </editor-fold>

    /*--------------------------------------------------------------------------------------------*/

    // <editor-fold defaultstate="collapsed" desc="Inicializaciones View">

    /**
     * Método que se encarga de inicializar las variables necesarias para el correcto funcionamiento
     * de la clase.
     * @param item
     */
    private void inicializacion(View item){

        this.lnly_selec = (LinearLayout) item.findViewById(R.id.lnly_linea_diario_exc);
        this.nom_ue_titulo = (TextView) item.findViewById(R.id.txtv_nom_ue_titulo);
        this.nom_ue = (TextView) item.findViewById(R.id.txtv_nombre_ue);
        this.tipo_ue_titulo = (TextView) item.findViewById(R.id.txtv_tipo_ue_titulo);
        this.tipo_ue = (TextView) item.findViewById(R.id.txtv_tipo_ue);
        this.descripcion_titulo = (TextView) item.findViewById(R.id.txtv_descripcion_titulo);
        this.descripcion = (TextView) item.findViewById(R.id.txtv_descripcion);
        this.fecha_creacion_ue_titulo = (TextView) item.findViewById(R.id.txtv_fecha_titulo);
        this.fecha_creacion_ue = (TextView) item.findViewById(R.id.txtv_fecha_creacion);
        this.datacion_1_titulo = (TextView) item.findViewById(R.id.txtv_datacion_1_titulo);
        this.datacion_1 = (TextView) item.findViewById(R.id.txtv_datacion_1);
        this.datacioin_2_titulo = (TextView) item.findViewById(R.id.txtv_datacion_2_titulo);
        this.datacion_2 = (TextView) item.findViewById(R.id.txtv_datacion_2);
        this.foto_titulo = (TextView) item.findViewById(R.id.txtv_foto_titulo);
        this.foto = (ImageView) item.findViewById(R.id.imgv_imagen);
        this.nombre_foto_titulo = (TextView) item.findViewById(R.id.txtv_nombre_foto_t);
        this.nombre_foto = (TextView) item.findViewById(R.id.txtv_nombre_foto);
        this.fecha_foto_titulo = (TextView) item.findViewById(R.id.txtv_fecha_foto_t);
        this.fecha_foto = (TextView) item.findViewById(R.id.txtv_fecha_foto);
        this.localizacion_gps_titulo = (TextView) item.findViewById(R.id.txtv_gps_titulo);
        this.localizacion_gps = (TextView) item.findViewById(R.id.txtv_gps);
        this.img_f = (ImageView) item.findViewById(R.id.imgv_imagen);
    }

    /**
     * Método que se encarga de dar el aspecto inicial a la vista.
     * @param posicion
     * @param item
     */
    private void aspectoInicial(int posicion, View item){

        this.nom_ue_titulo.setTypeface(this.font, Typeface.BOLD);
        this.nom_ue.setTypeface(this.font);
        this.nom_ue.setTextColor(Color.parseColor("#9E9E9E"));
        this.tipo_ue_titulo.setTypeface(this.font, Typeface.BOLD);
        this.tipo_ue.setTypeface(this.font);
        this.tipo_ue.setTextColor(Color.parseColor("#9E9E9E"));
        this.descripcion_titulo.setTypeface(this.font, Typeface.BOLD);
        this.descripcion.setTypeface(this.font);
        this.descripcion.setTextColor(Color.parseColor("#9E9E9E"));
        this.fecha_creacion_ue_titulo.setTypeface(this.font, Typeface.BOLD);
        this.fecha_creacion_ue.setTypeface(this.font);
        this.fecha_creacion_ue.setTextColor(Color.parseColor("#9E9E9E"));
        this.datacion_1_titulo.setTypeface(this.font, Typeface.BOLD);
        this.datacion_1.setTypeface(this.font);
        this.datacion_1.setTextColor(Color.parseColor("#9E9E9E"));
        this.datacioin_2_titulo.setTypeface(this.font, Typeface.BOLD);
        this.datacion_2.setTypeface(this.font);
        this.datacion_2.setTextColor(Color.parseColor("#9E9E9E"));
        this.foto_titulo.setTypeface(this.font, Typeface.BOLD);
        this.nombre_foto_titulo.setTypeface(this.font, Typeface.BOLD);
        this.nombre_foto.setTypeface(this.font);
        this.nombre_foto.setTextColor(Color.parseColor("#9E9E9E"));
        this.fecha_foto_titulo.setTypeface(this.font, Typeface.BOLD);
        this.fecha_foto.setTypeface(this.font);
        this.fecha_foto.setTextColor(Color.parseColor("#9E9E9E"));
        this.localizacion_gps_titulo.setTypeface(this.font, Typeface.BOLD);
        this.localizacion_gps.setTypeface(this.font);
        this.localizacion_gps.setTextColor(Color.parseColor("#9E9E9E"));

        if(nodos_ues.get(posicion).getNombre().equals(nombre_ue_seleccionada)){
            cambiarColor();
            notifyDataSetChanged();
            item.requestFocus();
            controlador.setUe_seleccionada(nombre_ue_seleccionada);
        }
    }

    /**
     * Método que se encarga de incicializar cada campo con los valores correspondientes de cada UE.
     * @param posicion
     */
    private void cargarValores(int posicion){

        this.nom_ue.setText("" + nodos_ues.get(posicion).getNombre());
        this.tipo_ue.setText("" + nodos_ues.get(posicion).getTipoUe());
        this.descripcion.setText("" + nodos_ues.get(posicion).getDescripcion());
        this.fecha_creacion_ue.setText("" + nodos_ues.get(posicion).getFechaCreacionUe());
        this.datacion_1.setText("" + nodos_ues.get(posicion).getDatacion1());
        this.datacion_2.setText("" + nodos_ues.get(posicion).getDatacion2());

        File imgFile = new File(String.valueOf(nodos_ues.get(posicion).getUrlFoto()));
        if(imgFile.exists()) {
            this.img_f.setImageURI(Uri.fromFile(imgFile));
        }
        this.img_f.setImageURI(Uri.parse(String.valueOf(nodos_ues.get(posicion).getUrlFoto()).toString()));

        this.nombre_foto.setText("" + nodos_ues.get(posicion).getNombreFoto());
        this.fecha_foto.setText("" + nodos_ues.get(posicion).getFechaFoto());
        this.localizacion_gps.setText("" + nodos_ues.get(posicion).getLocalizacion());
    }

    /**
     * Metodo que se encarga de cambiar el aspecto del item correspondiente.
     */
    public void cambiarColor(){

        this.lnly_selec.setBackgroundColor(azul);

        this.nom_ue_titulo.setTextColor(Color.BLACK);
        this.nom_ue.setTextColor(Color.WHITE);
        this.tipo_ue_titulo.setTextColor(Color.BLACK);
        this.tipo_ue.setTextColor(Color.WHITE);
        this.descripcion_titulo.setTextColor(Color.BLACK);
        this.descripcion.setTextColor(Color.WHITE);
        this.fecha_creacion_ue_titulo.setTextColor(Color.BLACK);
        this.fecha_creacion_ue.setTextColor(Color.WHITE);
        this.datacion_1_titulo.setTextColor(Color.BLACK);
        this.datacion_1.setTextColor(Color.WHITE);
        this.datacioin_2_titulo.setTextColor(Color.BLACK);
        this.datacion_2.setTextColor(Color.WHITE);
        this.foto_titulo.setTextColor(Color.BLACK);
        this.nombre_foto_titulo.setTextColor(Color.BLACK);
        this.nombre_foto.setTextColor(Color.WHITE);
        this.fecha_foto_titulo.setTextColor(Color.BLACK);
        this.fecha_foto.setTextColor(Color.WHITE);
        this.localizacion_gps_titulo.setTextColor(Color.BLACK);
        this.localizacion_gps.setTextColor(Color.WHITE);
    }

    // </editor-fold>

    /*--------------------------------------------------------------------------------------------*/

    // <editor-fold defaultstate="collapsed" desc="Capturando Eventos">

    /**
     * Método que se encarga de capturar los eventos onClick (seleccionar UE)  y onLongClick
     * (Eliminar UE) de los items que representan a cada una de las UEs.
     * @param item
     * @param posicion
     */
    private void capturarEventos(final View item, final int posicion) {

        this.lnly_selec.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                notifyDataSetChanged();
                nombre_ue_seleccionada = nodos_ues.get(posicion).getNombre().toString();
                controlador.setUe_seleccionada(nombre_ue_seleccionada);
                inicializacion(item);
                cambiarColor();
            }
        });

        this.lnly_selec.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                alertConfirmarEliminarUe(v, posicion);
                return false;
            }
        });

        this.img_f.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(!nodos_ues.get(posicion).getFechaFoto().toString().isEmpty()) {
                    Intent intent = new Intent(context, ImagenUe.class);
                    intent.putExtra("url", nodos_ues.get(posicion).getUrlFoto().toString());
                    context.startActivity(intent);
                } else {
                    Toast.makeText(context.getApplicationContext(), "Lo siento, no existe una foto para esta UE.", Toast.LENGTH_LONG).show();
                }
            }
        });

    }

    // </editor-fold>

    /*--------------------------------------------------------------------------------------------*/

    // <editor-fold defaultstate="collapsed" desc="Alerts">

    /**
     * Método que configura el Alert que pide la confirmación al usuario de que realmente
     * quiere eliminar la UE seleccionada mediante un LongClick.
     * @param v
     * @param posicion
     */
    private void alertConfirmarEliminarUe(View v, final int posicion){

        LayoutInflater li = LayoutInflater.from(context);
        final View promptsView = li.inflate(R.layout.activity_dialogo_confirmar_eliminar_ue, null);

        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
        alertDialogBuilder.setView(promptsView);

        alertDialogBuilder
                .setCancelable(false)
                .setPositiveButton("Aceptar", new DialogInterface.OnClickListener() {
                    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
                    public void onClick(DialogInterface dialog, int whichButton) {

                        String nom_ue = nodos_ues.get(posicion).getNombre().toString();
                        Boolean result = controlador.actualizarDescendientes(nombre_proyecto, nodos_ues.get(posicion));
                        if (!result) {
                            Toast.makeText(context.getApplicationContext(), "Lo siento se ha producido un error al realizar la operacion.", Toast.LENGTH_LONG).show();
                        } else {
                            if (nom_ue.equals(nombre_ue_seleccionada)) {
                                nombre_ue_seleccionada = "";
                                controlador.setUe_seleccionada("");
                            }
                            context.finish();
                            context.startActivity(context.getIntent());
                        }
                    }
                })
                .setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        dialog.cancel();
                    }
                });

        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();

        aspectoAlert(alertDialog, promptsView);
    }

    /**
     * Método que se encarga de darle aspecto al Alert anteriormente mencionado.
     * @param alertDialog
     * @param promptsView
     */
    private void aspectoAlert(AlertDialog alertDialog, View promptsView){
        alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

        TextView titulo = (TextView) promptsView.findViewById(R.id.fuente14);
        TextView nom = (TextView) promptsView.findViewById(R.id.fuente15);
        titulo.setTypeface(this.font);
        nom.setTypeface(this.font);

        aspectoBotonesPosNeg(alertDialog);
    }

    /**
     * Método que se encarga de darle aspecto a los botones "Aceptar" y "Cancelar" que ofrece
     * el Alert que nos ocupa.
     * @param alertDialog
     */
    private void aspectoBotonesPosNeg(AlertDialog alertDialog) {

        Button btn_cancelar = alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE);
        Button btn_aceptar = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);

        if (btn_cancelar != null && btn_aceptar != null) {

            btn_aceptar.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.dialog_button_selector));
            btn_aceptar.setTextColor(Color.WHITE);
            btn_aceptar.setTypeface(this.font);
            btn_cancelar.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.dialog_button_selector));
            btn_cancelar.setTextColor(Color.WHITE);
            btn_cancelar.setTypeface(this.font);

            LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) btn_aceptar.getLayoutParams();
            params.setMargins(20, 0, 0, 0);
            btn_aceptar.setLayoutParams(params);
        }
    }

    // </editor-fold>

    /*--------------------------------------------------------------------------------------------*/

    // <editor-fold defaultstate="collapsed" desc="Getters and Setters">

    public String getNombreUeSeleccionada() {
        return nombre_ue_seleccionada;
    }

    public void setNombreUeSeleccionada(String nombre_ue_seleccionada) {
        this.nombre_ue_seleccionada = nombre_ue_seleccionada;
    }

    // </editor-fold>

    /*--------------------------------------------------------------------------------------------*/
}


