package com.ramos.munoz.tesis;

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

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

import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.IntentService;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.RingtoneManager;
import android.preference.PreferenceManager;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.widget.TextView;

public class NotificacionServicio extends IntentService {
    private Notification notificacion;
    private static String nombreEstacionamiento;
    private static String fechaEntrada;
    private static Boolean mostrandoNotificacion = false;
    private static String userAcc;
    private static int cliId;
    private static int estId;

    public NotificacionServicio() {
	super("Notificacion servicio");
    }

    @Override
    public void onStart(Intent intent, int startId) {
	super.onStart(intent, startId);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
	Log.d("onHandleIntent", "inicio");
	AccountManager manager = (AccountManager) getSystemService(ACCOUNT_SERVICE);
	Account[] list = manager.getAccounts();
	for (Account account : list) {
	    if (account.type.equalsIgnoreCase(Constantes.ACCOUNT_TYPE)) {
		userAcc = account.name;
		SharedPreferences preferencias = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
		String usuario = preferencias.getString("editUsuario", "");
		String contrasena = preferencias.getString("editPassword", "");

		String respuesta = "false";
		Boolean esError = true;
		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_COMPROBAR_NOTIFICACION);
		    esError = respuestaJSON.has("error");
		    Log.d("RESPUESTA", respuestaJSON.toString());

		    if (!esError) {
			JSONArray variablesArray = respuestaJSON.getJSONArray("resultado");
			JSONObject variables = variablesArray.getJSONObject(0);
			String estado = variables.getString("estado");
			if (estado.equals("activado")) {

			    String patente = variables.getString("patente");
			    String fechaEntrada = variables.getString("fecha_entrada");
			    int id = variables.getInt("est_id");
			    cliId = variables.getInt("cli_id");
			    String nombreEstacionamiento = variables.getString("est_nombre");

			    Intent ventana = new Intent(this, NotificacionActivity.class);
			    ventana.putExtra("patente", patente);
			    ventana.putExtra("idEstacionamiento", id);
			    ventana.putExtra("fechaEntrada", fechaEntrada);
			    this.nombreEstacionamiento = nombreEstacionamiento;
			    estId = id;
			    this.fechaEntrada = fechaEntrada;
			    ventana.putExtra("nombreEstacionamiento", nombreEstacionamiento);

			    respuesta = "true";
			    if (!mostrandoNotificacion) {
				mostrarNotificacion(getApplicationContext(), ventana);
			    }
			}
		    } else if (mostrandoNotificacion) {

			borrarNotificacion(getApplicationContext());

		    }

		} catch (IOException e) {
		    e.printStackTrace();
		    Log.e("onHandleIntent", "Error 1: " + e.getMessage() + " : " + e.getCause());
		} catch (JSONException e) {
		    e.printStackTrace();
		    Log.e("onHandleIntent", "Error 2: " + e.getMessage() + " : " + e.getCause());
		} catch (Exception e) {
		    e.printStackTrace();
		    Log.e("onHandleIntent", "Error 3: " + e.getMessage() + " : " + e.getCause());
		}
	    }
	}

    }

    private void borrarNotificacion(Context context) {
	NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
	notificationManager.cancel(0);
	Intent intent = new Intent(this, HistorialDetalleActivity.class);
	intent.putExtra("idCliente", cliId);
	intent.putExtra("idEstacionamiento", estId);
	intent.putExtra("nombre", nombreEstacionamiento);

	PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0);
	NotificationCompat.Builder noti = new NotificationCompat.Builder(context);
	noti = new NotificationCompat.Builder(context);
	noti.setContentTitle("Salida de " + nombreEstacionamiento);
	String[] fechaYHora = fechaEntrada.split(" ");
	noti.setContentText("El " + fechaYHora[1] + " a las: " + fechaYHora[0]);
	noti.setSmallIcon(R.drawable.ic_launcher);
	Log.d("NOTIO", "NOTID");
	noti.setContentIntent(pIntent);

	noti.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));

	notificacion = noti.build();
	notificacion.flags |= Notification.FLAG_AUTO_CANCEL;
	// notificacion.flags |= Notification.FLAG_ONGOING_EVENT;
	notificationManager.notify(1, notificacion);
	mostrandoNotificacion = false;
    }

    private void mostrarNotificacion(Context context, Intent intent) {

	PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0);
	NotificationCompat.Builder noti = new NotificationCompat.Builder(context);
	noti = new NotificationCompat.Builder(context);
	noti.setContentTitle("Estacionado en " + nombreEstacionamiento);
	String[] fechaYHora = fechaEntrada.split(" ");
	noti.setContentText("El " + fechaYHora[1] + " a las: " + fechaYHora[0]);
	noti.setSmallIcon(R.drawable.ic_launcher);

	noti.setContentIntent(pIntent);

	noti.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
	NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

	// // Hide the notification after its selected
	// noti.flags |= Notification.FLAG_AUTO_CANCEL;
	notificacion = noti.build();
	notificacion.flags |= Notification.FLAG_ONGOING_EVENT;
	notificationManager.notify(0, notificacion);
	mostrandoNotificacion = true;
    }

    public static Boolean getMostrandoNotificacion() {
	return mostrandoNotificacion;

    }

    public static void setMostrandoNotificacion(Boolean mostrandoNotificacion) {
	NotificacionServicio.mostrandoNotificacion = mostrandoNotificacion;
    }

}
