package com.sunda.smps_flutter_pda;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.device.ScanManager;
import android.os.Build;
import android.text.TextUtils;
import android.util.Log;

import androidx.annotation.NonNull;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

import io.flutter.plugin.common.BinaryMessenger;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;

public class MethodChannelDemo implements MethodChannel.MethodCallHandler {

    private MethodChannel channel;


    private Activity activity;


    public MethodChannelDemo(BinaryMessenger messenger, Activity activity) {
        this.activity = activity;
        channel = new MethodChannel(messenger, "com.flutter.spms.MethodChannel");
        channel.setMethodCallHandler(this);
        com.sunda.smps_flutter_pda.FlutterScanManager.getInstance().init();
    }

    @Override
    public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
        if (Objects.equals(call.method, "startScan")) {
            com.sunda.smps_flutter_pda.FlutterScanManager.mScanManager.startDecode();
//            result.success("已启动扫描");
        } else if (Objects.equals(call.method, "startManager")) {
            ///启动服务
            registerScanReceiver(true);
            result.success("已注册扫描服务");
        } else if (Objects.equals(call.method, "closeManager")) {
            registerScanReceiver(false);
            result.success("已解除扫描服务");
        } else if (Objects.equals(call.method, "getDeviceID")){//获取PDA设备ID，其他手机没有这个字段，返回设备名称
            Class<?> c = null;
            String callback="";
            try {
                c = Class.forName("android.os.SystemProperties");
                Method get = c.getMethod("get", String.class);
                Object serialno =get.invoke(c, "persist.sys.product.serialno");
                callback=serialno.toString();
            } catch (Exception e) {
                callback= Build.MODEL;
            }
            result.success(callback);
        }

    }

    /**
     * @param register , ture register , false unregister
     */
    private void registerScanReceiver(boolean register) {
        if (register) {
            IntentFilter filter = new IntentFilter();
            filter.addAction(ScanManager.ACTION_DECODE);
            activity.registerReceiver(mReceiver, filter);
        } else {
            activity.unregisterReceiver(mReceiver);
        }
    }

    /**
     * 接受广播服务
     */
    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals(ScanManager.ACTION_DECODE)) {
               String barcodeStr = intent.getStringExtra(ScanManager.BARCODE_STRING_TAG);
                if (!TextUtils.isEmpty(barcodeStr)) {
                    byte scanType = intent.getByteExtra(ScanManager.BARCODE_TYPE_TAG, (byte) 0);
                    int engineType = OEMSymbologyId.getSymbologyId(com.sunda.smps_flutter_pda.FlutterScanManager.mScanManager.getOutputParameter(7));
                  String  barcodeFormat = OEMSymbologyId.stringFromSymbologyType(engineType, scanType);
                    channel.invokeMethod("getScanResult",  barcodeStr);
                }
            }
        }
    };
}
