/*
 * Copyright (C) 2016 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

package com.googlecode.android_scripting.facade;

import android.app.Service;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.preference.PreferenceManager;

import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
import com.googlecode.android_scripting.rpc.Rpc;
import com.googlecode.android_scripting.rpc.RpcOptional;
import com.googlecode.android_scripting.rpc.RpcParameter;

import java.io.IOException;
import java.util.Map;

/**
 * This facade allows access to the Preferences interface.
 *
 * <br>
 * <b>Notes:</b> <br>
 * <b>filename</b> - Filename indicates which preference file to refer to. If no filename is
 * supplied (the default) then the SharedPreferences uses is the default for the SL4A application.<br>
 * <b>prefPutValue</b> - uses "MODE_PRIVATE" when writing to preferences. Save values to the default
 * shared preferences is explicitly disallowed.<br>
 * <br>
 * See <a
 * href=http://developer.android.com/reference/java/util/prefs/Preferences.html>Preferences</a> and
 * <a href=http://developer.android.com/guide/topics/data/data-storage.html#pref>Shared
 * Preferences</a> in the android documentation on how preferences work.
 *
 * @author Robbie Matthews (rjmatthews62@gmail.com)
 */

public class PreferencesFacade extends RpcReceiver {

  private Service mService;

  public PreferencesFacade(FacadeManager manager) {
    super(manager);
    mService = manager.getService();
  }

  @Rpc(description = "Read a value from shared preferences")
  public Object prefGetValue(
      @RpcParameter(name = "key") String key,
      @RpcParameter(name = "filename", description = "Desired preferences file. If not defined, uses the default Shared Preferences.") @RpcOptional String filename) {
    SharedPreferences p = getPref(filename);
    return p.getAll().get(key);
  }

  @Rpc(description = "Write a value to shared preferences")
  public void prefPutValue(
      @RpcParameter(name = "key") String key,
      @RpcParameter(name = "value") Object value,
      @RpcParameter(name = "filename", description = "Desired preferences file. If not defined, uses the default Shared Preferences.") @RpcOptional String filename)
      throws IOException {
    if (filename == null || filename.equals("")) {
      throw new IOException("Can't write to default preferences.");
    }
    SharedPreferences p = getPref(filename);
    Editor e = p.edit();
    if (value instanceof Boolean) {
      e.putBoolean(key, (Boolean) value);
    } else if (value instanceof Long) {
      e.putLong(key, (Long) value);
    } else if (value instanceof Integer) {
      e.putLong(key, (Integer) value);
    } else if (value instanceof Float) {
      e.putFloat(key, (Float) value);
    } else if (value instanceof Double) { // TODO: Not sure if this is a good idea
      e.putFloat(key, ((Double) value).floatValue());
    } else {
      e.putString(key, value.toString());
    }
    e.commit();
  }

  @Rpc(description = "Get list of Shared Preference Values", returns = "Map of key,value")
  public Map<String, ?> prefGetAll(
      @RpcParameter(name = "filename", description = "Desired preferences file. If not defined, uses the default Shared Preferences.") @RpcOptional String filename) {
    return getPref(filename).getAll();
  }

  private SharedPreferences getPref(String filename) {
    if (filename == null || filename.equals("")) {
      return PreferenceManager.getDefaultSharedPreferences(mService);
    }
    return mService.getSharedPreferences(filename, 0);

  }

  @Override
  public void shutdown() {

  }
}
