package Model;

import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

import tool.ZoneDatabase;
import tool.ZoneRadar;

import android.database.Cursor;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.wifi.ScanResult;

public final class AccessPoint implements Comparable<AccessPoint>{
	final int _id;
	final String _bssid;
	final int _level;
	final String _name;
	
	private AccessPoint(final int id, final String bssid, final int level, final String name){
		_id = id;
		_bssid=bssid;
		_level=level;
		_name=name;
	}
	
	public static AccessPoint found(final SQLiteOpenHelper db, final String bssid, final int level, final String name){
		Cursor tmp = ZoneDatabase.query(db, "SELECT 1 FROM ap WHERE bssid='"+bssid+"';");
		if (tmp.getCount() == 0){
			ZoneDatabase.exec(db, "INSERT INTO ap (bssid) VALUES ('"+bssid+"');");
		}
		tmp.close();
		return new AccessPoint(0, bssid, level, name);
	}
	
	public static List<AccessPoint> getFromDB(final SQLiteOpenHelper db){
		List<AccessPoint> lst = new LinkedList();
		Cursor cur = ZoneDatabase.query(db, "SELECT id,bssid FROM ap;");
		cur.moveToFirst();
		while (!cur.isAfterLast()){
			lst.add(new AccessPoint(cur.getInt(0), cur.getString(1), 0, ""));
			cur.moveToNext();
		}
		cur.close();
		return lst;
	}
	
	public static List<AccessPoint> getFromDBByLocID(final SQLiteOpenHelper db, int locid){
		List<AccessPoint> lst = new LinkedList();
		Cursor cur = ZoneDatabase.query(db, "SELECT ap.id,ap.bssid FROM ap,link WHERE link.fk_loc='"+locid+"';");
		cur.moveToFirst();
		while (!cur.isAfterLast()){
			lst.add(new AccessPoint(cur.getInt(0), cur.getString(1), 0, ""));
			cur.moveToNext();
		}
		cur.close();
		return lst;
	}
	
	public static List<AccessPoint> getFromRadar(final SQLiteOpenHelper db, final ZoneRadar radar){
		List<AccessPoint> lst = new LinkedList();
		for (ScanResult rs: radar.getLst()){
			lst.add(AccessPoint.found(db, rs.BSSID, rs.level, rs.SSID));
		}
		Collections.sort(lst);
		return lst;
	}
	
	public int id(){
		return _id;
	}
	
	public int level(){
		return _level;
	}
	
	public String mac(){
		return _bssid;
	}

	public String name(){
		return _name;
	}
	
	public String toString(){
		return "" + id() + "[" + level() + "db] " + mac() + " " + name();
	}

	/*ça va me permettre de trier la liste par force de signal*/
	public int compareTo(AccessPoint another) {
		return level()-another.level();
	}
}
