// Path: liquid/src/main/java/io/lqd/sdk/LQLog.java
// public class LQLog {
// 
//     private static int LOG_LEVEL = 2;
// 
//     public static final int PATHS = 7;
//     public static final int HTTP = 6;
//     public static final int DATA = 5;
//     public static final int INFO_VERBOSE = 4;
//     public static final int INFO = 3;
//     public static final int WARNING = 2;
//     public static final int ERROR = 1;
// 
//     /**
//      * Changes the current Log level (Debugging proposes)
//      * @param level LogLevel
//      */
//     public static void setLevel(int level) {
//         if( level < 1 || level > 7)
//             throw new IllegalArgumentException("Log levels are between 1 and 7");
//         LOG_LEVEL = level;
//     }
// 
//     /**
//      * Gets the current log level
//      * @return the log level
//      */
//     public static int getLevel() {
//         return LOG_LEVEL;
//     }
// 
//     public static void paths(String message) {
//         if(LOG_LEVEL >= PATHS) {
//             Log.d(Liquid.TAG_LIQUID, message);
//         }
//     }
// 
//     public static void http(String message) {
//         if(LOG_LEVEL >= HTTP) {
//             Log.d(Liquid.TAG_LIQUID, message);
//         }
//     }
// 
//     public static void data(String message) {
//         if(LOG_LEVEL >= DATA) {
//             Log.v(Liquid.TAG_LIQUID, message);
//         }
//     }
// 
//     public static void infoVerbose(String message) {
//         if(LOG_LEVEL >= INFO_VERBOSE) {
//             Log.i(Liquid.TAG_LIQUID, message);
//         }
//     }
// 
//     public static void warning(String message) {
//         if(LOG_LEVEL >= WARNING) {
//             Log.w(Liquid.TAG_LIQUID, message);
//         }
//     }
// 
//     public static void info(String message) {
//         if(LOG_LEVEL >= INFO) {
//             Log.i(Liquid.TAG_LIQUID, message);
//         }
//     }
// 
//     public static void error(String message) {
//         if(LOG_LEVEL >= ERROR) {
//             Log.e(Liquid.TAG_LIQUID, message);
//         }
//     }
// 
// }


import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.UUID;
import io.lqd.sdk.LQLog;
import io.lqd.sdk.LiquidTools;
import android.content.Context;
import android.content.SharedPreferences;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
                (attribute instanceof Date));
        if(!isValid) {
            LiquidTools.exceptionOrLog(raiseException, "Value (" + attribute + ") with unsupported type. Supported: (String, Number, Boolean, Date)");
        }
        return isValid;
    }

    public static HashMap<String, Object> sanitizeAttributes(Map<String, Object> attributes, boolean raiseException) {
        if (attributes == null) {
            return null;
        }
        HashMap<String, Object> attrs = new HashMap<String, Object>();
        for (String key : attributes.keySet()) {
            if (LQModel.validKey(key, raiseException) && LQModel.validValue(attributes.get(key), raiseException)) {
                attrs.put(key, attributes.get(key));
            }
        }
        return attrs;
    }

    public void save(Context context, String path) {
        String serializedObject = toJSON().toString();

        SharedPreferences preferences = context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor prefsEditor = preferences.edit();

        String[] split = path.split("\\.");

        prefsEditor.putString(split[1], serializedObject);

// Path: liquid/src/main/java/io/lqd/sdk/LQLog.java
// public class LQLog {
// 
//     private static int LOG_LEVEL = 2;
// 
//     public static final int PATHS = 7;
//     public static final int HTTP = 6;
//     public static final int DATA = 5;
//     public static final int INFO_VERBOSE = 4;
//     public static final int INFO = 3;
//     public static final int WARNING = 2;
//     public static final int ERROR = 1;
// 
//     /**
//      * Changes the current Log level (Debugging proposes)
//      * @param level LogLevel
//      */
//     public static void setLevel(int level) {
//         if( level < 1 || level > 7)
//             throw new IllegalArgumentException("Log levels are between 1 and 7");
//         LOG_LEVEL = level;
//     }
// 
//     /**
//      * Gets the current log level
//      * @return the log level
//      */
//     public static int getLevel() {
//         return LOG_LEVEL;
//     }
// 
//     public static void paths(String message) {
//         if(LOG_LEVEL >= PATHS) {
//             Log.d(Liquid.TAG_LIQUID, message);
//         }
//     }
// 
//     public static void http(String message) {
//         if(LOG_LEVEL >= HTTP) {
//             Log.d(Liquid.TAG_LIQUID, message);
//         }
//     }
// 
//     public static void data(String message) {
//         if(LOG_LEVEL >= DATA) {
//             Log.v(Liquid.TAG_LIQUID, message);
//         }
//     }
// 
//     public static void infoVerbose(String message) {
//         if(LOG_LEVEL >= INFO_VERBOSE) {
//             Log.i(Liquid.TAG_LIQUID, message);
//         }
//     }
// 
//     public static void warning(String message) {
//         if(LOG_LEVEL >= WARNING) {
//             Log.w(Liquid.TAG_LIQUID, message);
//         }
//     }
// 
//     public static void info(String message) {
//         if(LOG_LEVEL >= INFO) {
//             Log.i(Liquid.TAG_LIQUID, message);
//         }
//     }
// 
//     public static void error(String message) {
//         if(LOG_LEVEL >= ERROR) {
//             Log.e(Liquid.TAG_LIQUID, message);
//         }
//     }
// 
// }


// Path: liquid/src/main/java/io/lqd/sdk/model/LQModel.java
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.UUID;
import io.lqd.sdk.LQLog;
import io.lqd.sdk.LiquidTools;
import android.content.Context;
import android.content.SharedPreferences;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;

                (attribute instanceof Date));
        if(!isValid) {
            LiquidTools.exceptionOrLog(raiseException, "Value (" + attribute + ") with unsupported type. Supported: (String, Number, Boolean, Date)");
        }
        return isValid;
    }

    public static HashMap<String, Object> sanitizeAttributes(Map<String, Object> attributes, boolean raiseException) {
        if (attributes == null) {
            return null;
        }
        HashMap<String, Object> attrs = new HashMap<String, Object>();
        for (String key : attributes.keySet()) {
            if (LQModel.validKey(key, raiseException) && LQModel.validValue(attributes.get(key), raiseException)) {
                attrs.put(key, attributes.get(key));
            }
        }
        return attrs;
    }

    public void save(Context context, String path) {
        String serializedObject = toJSON().toString();

        SharedPreferences preferences = context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor prefsEditor = preferences.edit();

        String[] split = path.split("\\.");

        prefsEditor.putString(split[1], serializedObject);

        LQLog.infoVerbose("Saving " + split[1] + " to shared prefs");