package Model;

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;

public final class Location {
	private final List<AccessPoint> apList;
	private final String name;
	private final int id;
	
	private Location(final int _id, final String _name, final List<AccessPoint> _aplst){
		apList = _aplst;
		name = _name;
		id = _id;
	}
	
	public static Location makeNewWith(final SQLiteOpenHelper db, final String name, final List<AccessPoint> _aplst){
		//add location
		ZoneDatabase.exec(db, "INSERT INTO loc (name) VALUES ('"+name.toLowerCase()+"');");
		Cursor tmp = ZoneDatabase.query(db, "last_insert_rowid();");
		int id = tmp.getInt(0);
		tmp.close();
//		//link with 3 top most aps or less
//		Collections.sort(_aplst);
//		List<AccessPoint> lst = new LinkedList();
//		for (int i=0;i<(_aplst.size()<3?_aplst.size():3);i++){
//			lst.add(_aplst.get(i));
//			ZoneDatabase.exec(db, "INSERT INTO link (level,fk_ap, fk_loc) VALUES ('"+lst.get(i).level()+"','"+lst.get(i).id()+"','"+id+"');");
//		}
		Collections.sort(_aplst);
		for (AccessPoint ap : _aplst){
			ZoneDatabase.exec(db, "INSERT INTO link (level,fk_ap, fk_loc) VALUES ('"+ap.level()+"','"+ap.id()+"','"+id+"');");
		}
		
		//end		
		return new Location(id, name, _aplst);
	}
	
//	public static Location makeNewFromRadar(final SQLiteOpenHelper db, final String name, final ZoneRadar radar){
//		return makeNewWith(db,name,AccessPoint.getFromRadar(db, radar));
//	}
	
	public static List<Location> getFromDB(final SQLiteOpenHelper db){
		List<Location> lst = new LinkedList();
		Cursor cur = ZoneDatabase.query(db, "SELECT id,name FROM loc;");
		cur.moveToFirst();
		while (!cur.isAfterLast()){
			List<AccessPoint> aplst= AccessPoint.getFromDBByLocID(db, cur.getInt(0));
			lst.add(new Location(cur.getInt(0), cur.getString(1),aplst));
			cur.moveToNext();
		}
		cur.close();
		return lst;
	}
	
	
	
	
	public String toString(){
		return name;
	}
}
