package de.tudarmstadt.informatik.hostage.ui;

import android.os.Parcel;
import android.os.Parcelable;

import java.util.ArrayList;
import java.util.HashMap;


public class LogFilter implements Parcelable{
	
	public final static String LOG_FILTER_INTENT_KEY = "de.tudarmstadt.informatik.hostage.logfilter";
	
	private static final String TIMESTAMP_BELOW_KEY = "de.tudarmstadt.informatik.hostage.logfilter.timestampbelow";
	private static final String TIMESTAMP_ABOVE_KEY = "de.tudarmstadt.informatik.hostage.logfilter.timestampabove";
	private static final String PROTOCOLS_KEY = "de.tudarmstadt.informatik.hostage.logfilter.protocols";
	private static final String ESSID_KEY = "de.tudarmstadt.informatik.hostage.logfilter.essid";
	private static final String BSSID_KEY = "de.tudarmstadt.informatik.hostage.logfilter.bssid";
	private static final String SORTTYPE_KEY = "de.tudarmstadt.informatik.hostage.logfilter.sorttype";

	public enum SortType{
				timestamp(0),
				protocol(1),
				_bssid(1),
				ssid(3),
				//remoteHostName(5),
				//lcaolHostName(6),
				_attack_id(7),
				_id(8);
		        private final int id;
		        SortType(int id) {
		        	this.id = id;
		        }
		        public int getValue() { 
		        	return id; 
		        }
		    }
	
	public ArrayList<String> BSSIDs;
	public ArrayList<String> ESSIDs;
	public ArrayList<String> protocols;
	
	public boolean isNotEditable;
	
	public SortType sorttype;

	public long belowTimestamp;
	public long aboveTimestamp;
	
	
	public LogFilter(){
		this.clear();

	}

    public void clear(){
        this.belowTimestamp = Long.MAX_VALUE;
        this.aboveTimestamp = Long.MIN_VALUE;
        this.sorttype = SortType.timestamp;
        this.BSSIDs = new ArrayList<String>();
        this.ESSIDs = new ArrayList<String>();
        this.protocols = new ArrayList<String>();
    }

	    public int describeContents() {
	        return 0;
	    }

	    // write your object's data to the passed-in Parcel
	    public void writeToParcel(Parcel out, int flags) {
	        HashMap<String, ArrayList<String>> values =new HashMap<String,  ArrayList<String>>();
	        if(this.BSSIDs != null && this.BSSIDs.size() > 0){
	        	values.put(BSSID_KEY , this.getBSSIDs() );
	        }
	        if(this.ESSIDs != null && this.ESSIDs.size() > 0){
	        	values.put(ESSID_KEY , this.getESSIDs() );
	        }
	        if(this.protocols != null && this.protocols.size() > 0){
	        	values.put(PROTOCOLS_KEY , this.getProtocols() );
	        }
	        long timeArray[] = new long[] {this.aboveTimestamp, this.belowTimestamp};

	        out.writeMap(values);
	        out.writeInt(this.sorttype.getValue());
	        out.writeDouble(timeArray.length);
	        out.writeLongArray(timeArray);
	        out.writeString(this.isNotEditable? "true" : "false");
	    }

	    
	    public static final Parcelable.Creator<LogFilter> CREATOR = new Parcelable.Creator<LogFilter>() {
	        public LogFilter createFromParcel(Parcel in) {
	            return new LogFilter(in);
	        }

	        public LogFilter[] newArray(int size) {
	            return new LogFilter[size];
	        }
	    };

	    // example constructor that takes a Parcel and gives you an object populated with it's values
	    private LogFilter(Parcel in) {
	        //mData = in.readInt();
	    	HashMap<String, ArrayList<String>> values = new HashMap<String, ArrayList<String>>();
	    	in.readMap(values, ArrayList.class.getClassLoader());
	    	
	    	this.BSSIDs = values.get(BSSID_KEY);
	    	this.ESSIDs = values.get(ESSID_KEY);
	    	this.protocols = values.get(protocols);
	    	
	    	if(this.BSSIDs == null) this.BSSIDs = new ArrayList<String>();
	    	if(this.ESSIDs == null) this.ESSIDs = new ArrayList<String>();
	    	if(this.protocols == null) this.protocols = new ArrayList<String>();
	    	
	    	this.sorttype = SortType.values()[Math.min(in.readInt(), SortType.values().length)];
	    	
	    	int size = (int)in.readDouble();
	    	long timeArray[] = new long[size];
	    	in.readLongArray(timeArray);
	    	
	    	this.belowTimestamp = timeArray[1];
	    	this.aboveTimestamp = timeArray[0];
	    	
	    	String bool = in.readString();
	    	if(bool.equals("true")) this.isNotEditable = true;
	    }
	    
	public boolean isNotEditable(){
		return this.isNotEditable;
	}
	public SortType getSorttype(){
		return this.sorttype;
	}
	public ArrayList<String> getBSSIDs(){
		return this.BSSIDs;
	}
	public ArrayList<String> getESSIDs(){
		return this.ESSIDs;
	}
	public ArrayList<String> getProtocols(){
		return this.protocols;
	}
	public void setIsNotEditable(boolean b){
		this.isNotEditable = b;
	}
	
	public long getBelowTimestamp(){
		return this.belowTimestamp;
	}
	public long getAboveTimestamp(){
		return this.aboveTimestamp;
	}
	public void setProtocols(ArrayList<String> protocols){
		this.protocols = protocols;
	}
	public void setBSSIDs(ArrayList<String> bssids){
		this.BSSIDs = bssids;
	}
	public void setESSIDs(ArrayList<String> essids){
		this.ESSIDs = essids;
	}
	public void setAboveTimestamp(long timestamp){
		this.aboveTimestamp = timestamp;
	}
	public void setBelowTimestamp(long timestamp){
		this.belowTimestamp = timestamp;
	}
	public void setSorttype(SortType type){
		this.sorttype = type;
	}
	
	
	public String getBSSIDQueryStatement(String tablename, String key){
		return this.convertArrayListToQueryString(this.BSSIDs, tablename, key);
	}
	public String getESSIDQueryStatement(String tablename, String key){
		return this.convertArrayListToQueryString(this.ESSIDs,tablename ,key);
	}
	public String getProtocolsQueryStatement(String tablename, String key){
		return this.convertArrayListToQueryString(this.protocols,tablename, key);
	}

    public boolean isSet(){
        boolean hasTime = this.hasATimestamp();
        boolean hasBSSIDs = this.hasBSSIDs();
        boolean hasESSIDs =this.hasESSIDs();
        boolean hasProtocols = this.hasProtocols();

        return hasBSSIDs || hasESSIDs || hasProtocols | hasTime;
    }

    public boolean hasBSSIDs(){
        return  this.getBSSIDs().size() > 0;
    }
    public boolean hasESSIDs(){
        return  this.getESSIDs().size() > 0;
    }
    public boolean hasProtocols(){
        return  this.getProtocols().size() > 0;
    }
    public boolean hasAboveTimestamp(){
        return this.aboveTimestamp != Long.MIN_VALUE;
    }
    public boolean hasBelowTimestamp(){
        return this.belowTimestamp != Long.MAX_VALUE;
    }
    public boolean hasATimestamp(){
        return this.hasBelowTimestamp()|| this.hasAboveTimestamp();
    }
	public String convertArrayListToQueryString(ArrayList<String> list, String table,  String key){
		String statement = "";
		if (list == null) return statement;
		statement = " ( ";

		int i = 0, max = list.size();
		for (String element : list){
			i++;
			statement = statement + table + "." + key + " = " + "'" + element + "'";
			if (i == max) continue;
			statement = statement +" OR ";
		}
		statement = statement + " ) ";

		return statement;
	}
	
}
