package com.eteng.geolocation.baidu;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
import com.eteng.geolocation.w3.PositionOptions;

import android.content.Context;

public class BDGeolocation {

  private String TAG = "BDGeolocation";
  private LocationClient client;

  public static final String COORD_BD09LL = "bd09ll";
  public static final String COORD_BD09 = "bd09";
  public static final String COORD_GCJ02 = "gcj02";

  private BDLocationListener listener;

  BDGeolocation(Context context) {
    client = new LocationClient(context);
  }

  private void setOptions(PositionOptions options) {
    // set default coorType
    String coorType = options.getCoorType();
    if (coorType == null || coorType.trim().isEmpty()) {
      coorType = COORD_GCJ02;
    }

    // set default locationMode
    LocationMode locationMode = LocationMode.Battery_Saving;
    if (options.isEnableHighAccuracy()) {
      locationMode = LocationMode.Hight_Accuracy;
    }

    LocationClientOption bdoptions = new LocationClientOption();
    bdoptions.setCoorType(coorType);
    bdoptions.setLocationMode(locationMode);
    client.setLocOption(bdoptions);
  }

  public boolean getCurrentPosition(PositionOptions options, final BDLocationListener callback) {
    listener = new BDLocationListener() {
      @Override
      public void onReceiveLocation(BDLocation location) {
        callback.onReceiveLocation(location);
        clearWatch();
      }
    };
    setOptions(options);
    client.registerLocationListener(listener);
    client.start();
    return true;
  }

  public boolean watchPosition(PositionOptions options, BDLocationListener callback) {
    listener = callback;
    setOptions(options);
    client.registerLocationListener(listener);
    client.start();
    return true;
  }

  public boolean clearWatch() {
    client.stop();
    client.unRegisterLocationListener(listener);
    listener = null;
    return true;
  }

}