package beacon;

import java.io.*;
import java.util.*;

public class BUserLocationDatabase implements Serializable {
  Hashtable locations;
  static long MIN_CONPONG = 120;

  BUserLocationDatabase () {
    locations = new Hashtable();
  }

  public void pong(String alias, String location){
    remove(alias, location);
    System.out.println("Restoring location "+location+" for "+alias);
    set(alias, location);
  }

  public void expire() {
    String a;
    BUserLocation bul;

    for (Enumeration e = locations.keys(); e.hasMoreElements();){
      a = (String) e.nextElement();
      for(Enumeration e2 = ((Vector) locations.get(a)).elements(); e2.hasMoreElements();){
	bul = (BUserLocation) e2.nextElement();
	long exp = bul.expire;
	if((System.currentTimeMillis()/1000) > exp){
	  System.out.println("Expiring location "+bul.location+" for "+a);
	  remove(a, bul);
	}
      }
    }
  }

  public void remove(String alias, BUserLocation b){
    Vector ls = (Vector) locations.get(alias);
    System.out.println("Removing location_ "+b.location+" for "+alias);
    ls.removeElement(b);
  }

  public void remove(String alias, String loc){
    Vector ls = (Vector) locations.get(alias);
    BUserLocation bul;

    System.out.println("Removing location "+loc+" for "+alias);
    if(ls == null)
      return;

    for(Enumeration e = ls.elements(); e.hasMoreElements();){
      bul = (BUserLocation) e.nextElement();
      if(loc.equals(bul.location)){
	ls.removeElement(bul);
	return;
      }
    }
  }

  public void set(String alias, String loc){
    Vector v;
    System.out.println("Removing old location");
    remove(alias, loc);
    System.out.println("Removed old location");
    if((v=(Vector)locations.get(alias))!=null){
      v.addElement(new BUserLocation(loc, (System.currentTimeMillis()/1000)+MIN_CONPONG));
    }
    else{
      v = new Vector(1);
      v.addElement(new BUserLocation(loc, (System.currentTimeMillis()/1000)+MIN_CONPONG));
      locations.put(alias, v);
    }
  }

  public Vector get(String alias){
    if(locations.get(alias) != null)
      return (Vector) locations.get(alias);
    else {
      return null;
    }
  }
}
