package com.ramos.munoz.tesis;

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

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.ramos.munoz.tesis.Vehiculo;

import android.util.Log;

public class Usuario {

    public static final String POST_USUARIO = "apodo";
    public static final String POST_CONTRASENA = "contrasena";
    public static final String POST_EMAIL = "correo";
    public static final String POST_CELULAR = "celular";
    public static final String POST_ESTADO = "estado";
    public static final String POST_AP_PATERNO = "ap_paterno";
    public static final String POST_AP_MATERNO = "ap_materno";
    public static final String POST_NOMBRE = "nombre";
    public static final String POST_CONTRASENA_NUEVA = "cNueva";

    // INDICES DEL ARREGLO "DATOS"
    public static final int INDICE_USUARIO = 0;
    public static final int INDICE_CONTRASENA = 1;
    public static final int INDICE_EMAIL = 2;
    public static final int INDICE_CELULAR = 3;
    public static final int INDICE_NOMBRE = 4;
    public static final int INDICE_AP_PATERNO = 5;
    public static final int INDICE_AP_MATERNO = 6;
    public static final int INDICE_ESTADOR = 7;
    private static final int INDICE_CONTRASENA_NUEVA = 8;

    private static ArrayList<NameValuePair> datos;
    private static ArrayList<Vehiculo> vehiculos;

    public boolean asignarVariables(JSONObject variables, String usuario, String pass) {
	datos = new ArrayList<NameValuePair>();
	try {
	    datos.add(new BasicNameValuePair(POST_USUARIO, usuario));
	    datos.add(new BasicNameValuePair(POST_CONTRASENA, pass));
	    // EMAIL
	    if (variables.has(POST_EMAIL) && !variables.getString(POST_EMAIL).equals("null")) datos.add(new BasicNameValuePair(POST_EMAIL, variables
		    .getString(POST_EMAIL)));
	    else datos.add(new BasicNameValuePair(POST_EMAIL, "No especificado"));

	    // CELULAR
	    if (variables.has(POST_CELULAR) && !variables.getString(POST_CELULAR).equals("null")) datos.add(new BasicNameValuePair(POST_CELULAR, variables
		    .getString(POST_CELULAR)));
	    else datos.add(new BasicNameValuePair(POST_CELULAR, "No especificado"));

	    // NOMBRE
	    if (variables.has(POST_NOMBRE) && !variables.getString(POST_NOMBRE).equals("null")) datos.add(new BasicNameValuePair(POST_NOMBRE, variables
		    .getString(POST_NOMBRE)));
	    else datos.add(new BasicNameValuePair(POST_NOMBRE, "No especificado"));

	    // APELLIDO PATERNO
	    if (variables.has(POST_AP_PATERNO) && !variables.getString(POST_AP_PATERNO).equals("null")) datos.add(new BasicNameValuePair(POST_AP_PATERNO,
		    variables.getString(POST_AP_PATERNO)));
	    else datos.add(new BasicNameValuePair(POST_NOMBRE, "No especificado"));

	    // APELLIDO PATERNO
	    if (variables.has(POST_AP_MATERNO) && !variables.getString(POST_AP_MATERNO).equals("null")) datos.add(new BasicNameValuePair(POST_AP_MATERNO,
		    variables.getString(POST_AP_MATERNO)));
	    else datos.add(new BasicNameValuePair(POST_AP_MATERNO, "No especificado"));

	    datos.add(new BasicNameValuePair(POST_ESTADO, variables.getString(POST_ESTADO)));
	    return true;
	} catch (Exception e) {
	    e.printStackTrace();
	    Log.e("AsignarVariables", "ERROR: " + e.getMessage());
	}
	return false;

    }

    public boolean registrarUsuario(ArrayList<NameValuePair> parametrosValues) {
	Log.d("RegistroDeUsuario", "Se inicio el registro de usuario");
	Boolean resultado = false;
	try {
	    ArrayList<NameValuePair> parametros = parametrosValues;

	    ConexionServidor con = new ConexionServidor();
	    JSONObject existeUsuario = con.ejecutarHttpPost(parametros, ConexionServidor.URL_COMPROBAR_USUARIO);
	    Boolean sePuede = existeUsuario.getBoolean("respuesta");

	    if (sePuede) {
		JSONObject respuestaJSON = con.ejecutarHttpPost(parametros, ConexionServidor.URL_REGISTRO_USUARIO);
		resultado = respuestaJSON.getBoolean("resultado");
		Log.d("RRegistroDeUsuario", "Valor a retornar: " + resultado);
	    } else {
		return false;
	    }
	} catch (Exception e) {
	    e.printStackTrace();
	    Log.e("RegistroDeUsuario", "Error: " + e.getMessage());
	}
	return resultado;
    }

    public static ArrayList<Vehiculo> cargarVehiculos() {
	Log.d("cargarVehiculos", "Se inicio la busqueda de vehiculos");
	vehiculos = new ArrayList<Vehiculo>();
	String respuesta = "Todo bien";
	String error = "";
	try {
	    ArrayList<NameValuePair> parametros = new ArrayList<NameValuePair>();
	    String usuario = datos.get(INDICE_USUARIO).getValue();
	    String contrasena = datos.get(INDICE_CONTRASENA).getValue();
	    parametros.add(new BasicNameValuePair(POST_USUARIO, usuario));
	    parametros.add(new BasicNameValuePair(POST_CONTRASENA, contrasena));

	    ConexionServidor con = new ConexionServidor();
	    JSONObject respuestaJSON = con.ejecutarHttpPost(parametros, ConexionServidor.URL_CARGAR_VEHICULOS);
	    boolean esError = true;
	    esError = respuestaJSON.has("error");
	    if (esError) {
		error = respuestaJSON.getString("error");
		respuesta = error;
		Log.d("cargarVehiculos", "No se encontraron vehículos");
	    } else {
		JSONArray variables = respuestaJSON.getJSONArray("resultado");
		for (int i = 0; i < variables.length(); i++) {

		    JSONObject vehiculoJSON = variables.getJSONObject(i);
		    int id = vehiculoJSON.getInt("id");
		    String patente = vehiculoJSON.getString("patente");
		    String marca = vehiculoJSON.getString("marca");
		    String modelo = vehiculoJSON.getString("modelo");
		    String carroceria = vehiculoJSON.getString("carroceria");
		    Vehiculo v = new Vehiculo(id, patente, marca, modelo, carroceria);
		    vehiculos.add(v);
		}
	    }
	} catch (IOException e) {
	    e.printStackTrace();
	    Log.e("cargarVehiculos", "Error 1: " + e.getMessage() + " : " + e.getCause());
	} catch (JSONException e) {
	    e.printStackTrace();
	    Log.e("cargarVehiculos", "Error 2: " + e.getMessage() + " : " + e.getCause());
	} catch (Exception e) {
	    e.printStackTrace();
	    Log.e("cargarVehiculos", "Error 3: " + e.getMessage() + " : " + e.getCause());
	}
	Log.d("cargarVehiculos", "Valor a retornar: " + respuesta);
	return vehiculos;
    }

    public String ingresar(String usuario, String contrasena) {
	Log.d("AutenticarUsuario", "Se inicio la autenticación de usuario");
	String respuesta = "";
	String error = "";
	try {
	    ArrayList<NameValuePair> parametros = new ArrayList<NameValuePair>();
	    parametros.add(new BasicNameValuePair(Usuario.POST_USUARIO, usuario));
	    parametros.add(new BasicNameValuePair(Usuario.POST_CONTRASENA, contrasena));
	    ConexionServidor con = new ConexionServidor();
	    JSONObject respuestaJSON = con.ejecutarHttpPost(parametros, ConexionServidor.URL_AUTENTICAR_USUARIO);
	    boolean esError = true;

	    esError = respuestaJSON.has("error");
	    if (esError) {
		error = respuestaJSON.getString("error");
		respuesta = error;
		Log.w("AutenticarUsuario", respuesta);
	    } else {
		JSONObject variables = respuestaJSON.getJSONObject("resultado");
		Log.d("AutenticarUsuario", variables.toString());
		if (asignarVariables(variables, usuario, contrasena)) {
		    respuesta = "bien";
		    Log.d("AutenticarUsuario", "Variables asignadas");
		} else {
		    respuesta = "Ha ocurrido un error";
		    Log.w("AutenticarUsuario", "No se han podido asignar las variables");
		}
	    }
	} catch (IOException e) {
	    e.printStackTrace();
	    Log.e("AutenticarUsuario", "Error 1: " + e.getMessage() + " : " + e.getCause());
	} catch (JSONException e) {
	    e.printStackTrace();
	    Log.e("AutenticarUsuario", "Error 2: " + e.getMessage() + " : " + e.getCause());
	} catch (Exception e) {
	    e.printStackTrace();
	    Log.e("AutenticarUsuario", "Error 3: " + e.getMessage() + " : " + e.getCause());
	}
	Log.d("AutenticarUsuario", "Valor a retornar: " + respuesta);
	return respuesta;
    }

    public static Boolean guardarCambios(Boolean pass) {
	Log.d("guardarCambios", "Se inicio la autenticación de usuario");
	String respuesta = "";
	String error = "";
	try {
	    ArrayList<NameValuePair> parametros = new ArrayList<NameValuePair>();
	    if (pass) {
		parametros.add(new BasicNameValuePair(POST_CONTRASENA_NUEVA, datos.get(INDICE_CONTRASENA_NUEVA).getValue()));
		Usuario.datos.remove(INDICE_CONTRASENA_NUEVA);
	    }

	    parametros.add(new BasicNameValuePair(POST_USUARIO, datos.get(INDICE_USUARIO).getValue()));
	    parametros.add(new BasicNameValuePair(POST_CONTRASENA, datos.get(INDICE_CONTRASENA).getValue()));

	    parametros.add(new BasicNameValuePair(POST_EMAIL, datos.get(INDICE_EMAIL).getValue()));
	    parametros.add(new BasicNameValuePair(POST_CELULAR, datos.get(INDICE_CELULAR).getValue()));
	    parametros.add(new BasicNameValuePair(POST_NOMBRE, datos.get(INDICE_NOMBRE).getValue()));
	    parametros.add(new BasicNameValuePair(POST_AP_PATERNO, datos.get(INDICE_AP_PATERNO).getValue()));
	    parametros.add(new BasicNameValuePair(POST_AP_MATERNO, datos.get(INDICE_AP_MATERNO).getValue()));

	    ConexionServidor con = new ConexionServidor();
	    JSONObject respuestaJSON = con.ejecutarHttpPost(parametros, ConexionServidor.URL_MODIFICAR_DATOS);
	    boolean esError = true;

	    esError = respuestaJSON.has("error");
	    if (esError) {
		error = respuestaJSON.getString("error");
		respuesta = error;
		Log.w("guardarCambios", respuesta);
	    } else {
		Boolean res = respuestaJSON.getBoolean("resultado");
		if (res) {
		    return true;
		}
	    }
	} catch (IOException e) {
	    e.printStackTrace();
	    Log.e("guardarCambios", "Error 1: " + e.getMessage() + " : " + e.getCause());
	} catch (JSONException e) {
	    e.printStackTrace();
	    Log.e("guardarCambios", "Error 2: " + e.getMessage() + " : " + e.getCause());
	} catch (Exception e) {
	    e.printStackTrace();
	    Log.e("guardarCambios", "Error 3: " + e.getMessage() + " : " + e.getCause());
	}
	Log.d("guardarCambios", "Valor a retornar: " + respuesta);
	return false;
    }

    public static ArrayList<Historial> verHistorial(int offSet, int limite) {
	Log.d("VerHistorial", "Se inicio la busqueda de historial");
	ArrayList<Historial> historiales = new ArrayList<Historial>();
	String respuesta = "Todo bien";
	String error = "";
	try {
	    ArrayList<NameValuePair> parametros = new ArrayList<NameValuePair>();
	    String usuario = datos.get(INDICE_USUARIO).getValue();
	    String contrasena = datos.get(INDICE_CONTRASENA).getValue();

	    parametros.add(new BasicNameValuePair("limite", Integer.toString(limite)));
	    parametros.add(new BasicNameValuePair("offset", Integer.toString(offSet)));
	    parametros.add(new BasicNameValuePair(Usuario.POST_USUARIO, usuario));
	    parametros.add(new BasicNameValuePair(Usuario.POST_CONTRASENA, contrasena));

	    ConexionServidor con = new ConexionServidor();
	    JSONObject respuestaJSON = con.ejecutarHttpPost(parametros, ConexionServidor.URL_VER_HISTORIAL);
	    boolean esError = true;
	    esError = respuestaJSON.has("error");
	    Log.d("HISTORIAL", respuestaJSON.toString());

	    if (esError) {
		error = respuestaJSON.getString("error");
		respuesta = error;
		Log.e("VerHistorial", error);
	    } else {
		JSONArray variables = respuestaJSON.getJSONArray("resultado");
		for (int i = 0; i < variables.length(); i++) {
		    JSONObject historialJSON = variables.getJSONObject(i);
		    int id = historialJSON.getInt("id");
		    int idEstacionamiento = historialJSON.getInt("id_estacionamiento");
		    int tieneValoracion = historialJSON.getInt("valoracion");
		    int valoracion = historialJSON.getInt("valor");
		    String nombreEstacionamiento = historialJSON.getString("nombre");
		    String fechaEstacionado = historialJSON.getString("fecha");

		    Historial h = new Historial(nombreEstacionamiento, fechaEstacionado, tieneValoracion, id, valoracion, idEstacionamiento);
		    historiales.add(h);
		}
	    }
	} catch (IOException e) {
	    e.printStackTrace();
	    Log.e("ConexionServidor", "Error 1: " + e.getMessage() + " : " + e.getCause());
	} catch (JSONException e) {
	    e.printStackTrace();
	    Log.e("ConexionServidor", "Error 2: " + e.getMessage() + " : " + e.getCause());
	} catch (Exception e) {
	    e.printStackTrace();
	    Log.e("ConexionServidor", "Error 3: " + e.getMessage() + " : " + e.getCause());
	}
	Log.d("VerHistorial", "Valor a retornar: " + respuesta);
	return historiales;
    }

    public static ArrayList<NameValuePair> getDatos() {
	return datos;
    }

    public static void setDatos(ArrayList<NameValuePair> datos) {
	Usuario.datos = datos;
    }

    public static void borrarDatos() {
	// Usuario.datos.clear();
	Usuario.datos = null;
    }

    public static void setContrasena(String contrasena) {
	Usuario.datos.set(INDICE_CONTRASENA, new BasicNameValuePair(POST_CONTRASENA, contrasena));
    }

    public static void setApPaterno(String apPat) {
	Usuario.datos.set(INDICE_AP_PATERNO, new BasicNameValuePair(POST_AP_PATERNO, apPat));
    }

    public static void setCelular(String celular) {
	Usuario.datos.set(INDICE_CELULAR, new BasicNameValuePair(POST_CELULAR, celular));
    }

    public static void setApMaterno(String apMat) {
	Usuario.datos.set(INDICE_AP_MATERNO, new BasicNameValuePair(POST_AP_MATERNO, apMat));
    }

    public static void setNombre(String nombre) {
	Usuario.datos.set(INDICE_NOMBRE, new BasicNameValuePair(POST_NOMBRE, nombre));
    }

    public static void setEmail(String email) {
	Usuario.datos.set(INDICE_EMAIL, new BasicNameValuePair(POST_EMAIL, email));
    }

    public static ArrayList<Vehiculo> getVehiculos() {
	return vehiculos;
    }

    public static void setVehiculos(ArrayList<Vehiculo> vehiculos) {
	Usuario.vehiculos = vehiculos;
    }

    public static void setContrasenaNueva(String pass) {
	Usuario.datos.add(new BasicNameValuePair(POST_CONTRASENA_NUEVA, pass));
    }

}
