/*
 * 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.telephony;

import android.app.Service;
import android.content.Context;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;

import com.googlecode.android_scripting.MainThread;
import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
import com.googlecode.android_scripting.facade.EventFacade;
import com.googlecode.android_scripting.facade.FacadeManager;
import com.googlecode.android_scripting.rpc.Rpc;
import com.googlecode.android_scripting.rpc.RpcStartEvent;
import com.googlecode.android_scripting.rpc.RpcStopEvent;

import java.util.concurrent.Callable;

/**
 * Exposes SignalStrength functionality.
 *
 * @author Joerg Zieren (joerg.zieren@gmail.com)
 */
public class SignalStrengthFacade extends RpcReceiver {
  private final Service mService;
  private final TelephonyManager mTelephonyManager;
  private final EventFacade mEventFacade;
  private final PhoneStateListener mPhoneStateListener;
  private Bundle mSignalStrengths;
  private final int INVALID_VALUE = Integer.MIN_VALUE;

  public SignalStrengthFacade(FacadeManager manager) {
    super(manager);
    mSignalStrengths = new Bundle();
    mService = manager.getService();
    mEventFacade = manager.getReceiver(EventFacade.class);
    mTelephonyManager =
        (TelephonyManager) manager.getService().getSystemService(Context.TELEPHONY_SERVICE);
    mPhoneStateListener = MainThread.run(mService, new Callable<PhoneStateListener>() {
      @Override
      public PhoneStateListener call() throws Exception {
        return new PhoneStateListener() {
          @Override
          public void onSignalStrengthsChanged(SignalStrength signalStrength) {
            mSignalStrengths.putInt("GsmSignalStrength", signalStrength.getGsmSignalStrength());
            mSignalStrengths.putInt("GsmBitErrorRate", signalStrength.getGsmBitErrorRate());
            mSignalStrengths.putInt("CdmaEcio", signalStrength.getCdmaEcio());
            mSignalStrengths.putInt("EvdoDbm", signalStrength.getEvdoDbm());
            mSignalStrengths.putInt("EvdoEcio", signalStrength.getEvdoEcio());
            mSignalStrengths.putInt("LteSignalStrength", signalStrength.getLteSignalStrength());
            mSignalStrengths.putInt("LteDbm", signalStrength.getLteDbm());
            mSignalStrengths.putInt("LteLevel", signalStrength.getLteLevel());
            mSignalStrengths.putInt("LteAsuLevel", signalStrength.getLteAsuLevel());
            mSignalStrengths.putInt("Level", signalStrength.getLevel());
            mSignalStrengths.putInt("AsuLevel", signalStrength.getAsuLevel());
            mSignalStrengths.putInt("Dbm", signalStrength.getDbm());
            mSignalStrengths.putInt("GsmDbm", signalStrength.getGsmDbm());
            mSignalStrengths.putInt("GsmLevel", signalStrength.getGsmLevel());
            mSignalStrengths.putInt("GsmAsuLevel", signalStrength.getGsmAsuLevel());
            mSignalStrengths.putInt("CdmaLevel", signalStrength.getCdmaLevel());
            mSignalStrengths.putInt("CdmaAsuLevel", signalStrength.getCdmaAsuLevel());
            mSignalStrengths.putInt("CdmaDbm", signalStrength.getCdmaDbm());
            mEventFacade.postEvent("signal_strengths", mSignalStrengths.clone());
          }
        };
      }
    });
  }

  @Rpc(description = "Starts tracking signal strengths.")
  @RpcStartEvent("signal_strengths")
  public void startTrackingSignalStrengths() {
    mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
  }

  @Rpc(description = "Returns the current signal strengths.", returns = "A map of \"gsm_signal_strength\"")
  public Bundle phoneGetSignalStrengthInfo() {
    return mSignalStrengths;
  }

  @Rpc(description = "Returns current signal strength in dBm.")
  public Integer phoneGetSignalStrengthDbm() {
    Integer result = mSignalStrengths.getInt("Dbm", INVALID_VALUE);
    return (result.equals(INVALID_VALUE)?null:result);
  }

  @Rpc(description = "Returns current signal strength in AsuLevel.")
  public Integer phoneGetSignalStrengthAsu() {
    Integer result = mSignalStrengths.getInt("AsuLevel", INVALID_VALUE);
    return (result.equals(INVALID_VALUE)?null:result);
  }

  @Rpc(description = "Returns current signal strength in Level.")
  public Integer phoneGetSignalStrengthLevel() {
    Integer result = mSignalStrengths.getInt("Level", INVALID_VALUE);
    return (result.equals(INVALID_VALUE)?null:result);
  }

  @Rpc(description = "Stops tracking signal strength.")
  @RpcStopEvent("signal_strengths")
  public void stopTrackingSignalStrengths() {
    mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
  }

  @Override
  public void shutdown() {
    stopTrackingSignalStrengths();
  }
}
