package com.ygmpkk.flutter_umplus;

import android.app.Activity;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.util.Log;
import com.umeng.analytics.MobclickAgent;
import com.umeng.commonsdk.UMConfigure;
import com.umeng.commonsdk.statistics.common.DeviceConfig;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.plugin.common.PluginRegistry.Registrar;

/** FlutterUmplusPlugin */
public class FlutterUmplusPlugin implements MethodCallHandler {
  private Activity activity;

  private FlutterUmplusPlugin(Activity activity) { this.activity = activity; }

  /** Plugin registration. */
  public static void registerWith(Registrar registrar) {
    final MethodChannel channel =
        new MethodChannel(registrar.messenger(), "ygmpkk/flutter_umplus");
    channel.setMethodCallHandler(new FlutterUmplusPlugin(registrar.activity()));
  }

  @Override
  public void onMethodCall(MethodCall call, Result result) {
    if (call.method.equals("getPlatformVersion")) {
      result.success("Android " + android.os.Build.VERSION.RELEASE);
    } else if (call.method.equals("init")) {
      initSetup(call, result);
    } else if (call.method.equals("beginPageView")) {
      beginPageView(call, result);
    } else if (call.method.equals("endPageView")) {
      endPageView(call, result);
    } else if (call.method.equals("logPageView")) {
      logPageView(call, result);
    } else if (call.method.equals("event")) {
      event(call, result);
    } else {
      result.notImplemented();
    }
  }

    private static String getMetadata(Context context, String name) {
        try {
            ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo(
                    context.getPackageName(), PackageManager.GET_META_DATA);
            if (appInfo.metaData != null) {
                return appInfo.metaData.getString(name);
            }
        } catch (PackageManager.NameNotFoundException e) {
        }

        return null;
    }



    private void initSetup(MethodCall call, Result result) {
    String appKey = (String)call.argument("key");
    String channel = (String)call.argument("channel");
    Boolean logEnable = (Boolean)call.argument("logEnable");
    Boolean encrypt = (Boolean)call.argument("encrypt");
    Boolean reportCrash = (Boolean)call.argument("reportCrash");

    Log.d("UM", "initSetup: " + appKey);
//    Log.d("UM", "channel: " +  getMetadata(activity, "INSTALL_CHANNEL"));

    UMConfigure.setLogEnabled(logEnable);
    UMConfigure.init(activity, appKey, channel, UMConfigure.DEVICE_TYPE_PHONE,
                     null);
    UMConfigure.setEncryptEnabled(encrypt);

    MobclickAgent.setSessionContinueMillis(30000L);
    MobclickAgent.setCatchUncaughtExceptions(reportCrash);

    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
      // 大于等于4.4选用AUTO页面采集模式
      MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.AUTO);
    } else {
      MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.MANUAL);
    }


    result.success(true);
  }

  public void beginPageView(MethodCall call, Result result) {
    String name = (String)call.argument("name");
    Log.d("UM", "beginPageView: " + name);
    MobclickAgent.onPageStart(name);
    MobclickAgent.onResume(activity);
    result.success(null);
  }

  public void endPageView(MethodCall call, Result result) {
    String name = (String)call.argument("name");
    Log.d("UM", "endPageView: " + name);
    MobclickAgent.onPageEnd(name);
    MobclickAgent.onPause(activity);
    result.success(null);
  }

  public void logPageView(MethodCall call, Result result) {
    // MobclickAgent.onProfileSignIn((String)call.argument("name"));
    // Session间隔时长,单位是毫秒,默认Session间隔时间是30秒,一般情况下不用修改此值
//    Long seconds = Double.valueOf(call.argument("seconds")).longValue();
//    MobclickAgent.setSessionContinueMillis(seconds);
    result.success(null);
  }

  public void event(MethodCall call, Result result) {
    String name = (String)call.argument("name");
    String label = (String)call.argument("label");
    if (label == null) {
      MobclickAgent.onEvent(activity, name);
    } else {
      MobclickAgent.onEvent(activity, name, label);
    }
    result.success(null);
  }

  public static String[] getTestDeviceInfo(Context context) {
    String[] deviceInfo = new String[2];
    try {
      if (context != null) {
        deviceInfo[0] = DeviceConfig.getDeviceIdForGeneral(context);
        deviceInfo[1] = DeviceConfig.getMac(context);
        Log.d("UM", deviceInfo[0]);
        Log.d("UM", deviceInfo[1]);
      }
    } catch (Exception e) {
    }
    return deviceInfo;
  }
}