import tab from "./tab.plugins";
import { settingStores } from "@/store/modules/index";

var NfcAdapter;
var NdefRecord;
var NdefMessage;
var waiting;
var readyWriteData = false; //开启写
var readyRead = false; //开启读
var whetherNFC = false; //是否有NFC
var techListsArray = [
    ["android.nfc.tech.IsoDep"],
    ["android.nfc.tech.NfcA"],
    ["android.nfc.tech.NfcB"],
    ["android.nfc.tech.NfcF"],
    ["android.nfc.tech.Nfcf"],
    ["android.nfc.tech.NfcV"],
    ["android.nfc.tech.NdefFormatable"],
    ["android.nfc.tech.MifareClassic"],
    ["android.nfc.tech.MifareUltralight"],
];

export default {
    initNFC() {
        if (uni.getSystemInfoSync().platform == "android") {
            listenNFCStatus();
        }

        if (uni.getSystemInfoSync().platform == "ios") {
            uni.showToast({
                title: "设备不支持NFC！",
                icon: "none",
            });
            return;
        }
    },
    readNFC(callback) {
        if (uni.getSystemInfoSync().platform == "android") {
            readData(callback);
        }
    },
    closeNFC() {
        if (uni.getSystemInfoSync().platform == "android") {
            closeReadAndWrite();
        }
    }
}

function listenNFCStatus() {
    try {
        var main = plus.android.runtimeMainActivity();
        var Intent = plus.android.importClass("android.content.Intent");
        var Activity = plus.android.importClass("android.app.Activity");
        var PendingIntent = plus.android.importClass("android.app.PendingIntent");
        var IntentFilter = plus.android.importClass("android.content.IntentFilter");
        NfcAdapter = plus.android.importClass("android.nfc.NfcAdapter");
        var nfcAdapter = NfcAdapter.getDefaultAdapter(main);

        if (nfcAdapter == null) {
            uni.showToast({
                title: "设备不支持NFC！",
                icon: "none",
            });
            return;
        }

        if (!nfcAdapter.isEnabled()) {
            uni.showToast({
                title: "请在系统设置中先启用NFC功能！",
                icon: "none",
            });
            return;
        }

        uni.navigateTo({
            url: "/pages/common/nfc/index",
        });

        var intent = new Intent(main, main.getClass());
        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        var pendingIntent = PendingIntent.getActivity(main, 0, intent, 0);
        var ndef = new IntentFilter("android.nfc.action.TECH_DISCOVERED");
        ndef.addDataType("*/*");
        var intentFiltersArray = [ndef];

        plus.globalEvent.addEventListener(
            "newintent",
            function () {
                plus.device.vibrate(500);//调用手机震动
                setTimeout(handleNFCData, 1000);// 轮询调用 NFC
            },
            false
        );
        plus.globalEvent.addEventListener(
            "pause",
            function (e) {
                if (nfcAdapter) {
                    //关闭前台调度系统
                    //恢复默认状态
                    nfcAdapter.disableForegroundDispatch(main);
                }
            },
            false
        );
        plus.globalEvent.addEventListener(
            "resume",
            function (e) {
                if (nfcAdapter) {
                    //开启前台调度系统
                    // 优于所有其他NFC
                    nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray);
                }
            },
            false
        );
        nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray);
    } catch (e) {
        console.error(e);
    }
}

function handleNFCData() {
    NdefRecord = plus.android.importClass("android.nfc.NdefRecord");
    NdefMessage = plus.android.importClass("android.nfc.NdefMessage");
    var main = plus.android.runtimeMainActivity();
    var intent = main.getIntent();
    if ("android.nfc.action.TECH_DISCOVERED" == intent.getAction()) {
        if (readyWriteData) {
            //__write(intent);
            readyWriteData = false;
        } else if (readyRead) {
            __read(intent);
            readyRead = false;
        }
    }
}

function showToast(msg) {
    plus.nativeUI.toast(msg);
}

/**
 * @NFC写入
 * @param {*} intent
 * @returns
 */
function __write(intent) {
    try {
        waiting.setTitle("请勿移开标签\n正在写入...");
        var text = document.getElementById("text").value;
        console.log("text=" + text);

        var textBytes = plus.android.invoke(text, "getBytes");
        var textRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, plus.android.invoke("text/plain", "getBytes"), plus.android.invoke("", "getBytes"), textBytes);
        var message = new NdefMessage([textRecord]);
        var Ndef = plus.android.importClass("android.nfc.tech.Ndef");
        var NdefFormatable = plus.android.importClass("android.nfc.tech.NdefFormatable");
        var tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        var ndef = Ndef.get(tag);
        if (ndef != null) {
            var size = message.toByteArray().length;
            console.log("size=" + size);
            ndef.connect();
            if (!ndef.isWritable()) {
                showToast("tag不允许写入");
                waiting.close();
                return;
            }
            if (ndef.getMaxSize() < size) {
                showToast("文件大小超出容量");
                waiting.close();
                return;
            }

            ndef.writeNdefMessage(message);
            waiting.close();
            showToast("写入数据成功.");
            return;
        } else {
            var format = NdefFormatable.get(tag);
            if (format != null) {
                try {
                    format.connect();
                    format.format(message);
                    showToast("格式化tag并且写入message");
                    waiting.close();
                    return;
                } catch (e) {
                    showToast("格式化tag失败.");
                    waiting.close();
                    return;
                }
            } else {
                showToast("Tag不支持NDEF");
                waiting.close();
                return;
            }
        }
    } catch (e) {
        console.log("error=" + e);
        waiting.close();
        alert("写入失败");
    }
}

/**
 * @NFC读取
 * @param {*} intent
 * @returns
 */
function __read(intent) {
    try {
        settingStores().nfcWaiting = '请勿移开标签\n正在读取数据...'
        // waiting.setTitle("请勿移开标签\n正在读取数据...");
        var tag = plus.android.importClass("android.nfc.Tag");
        tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        var bytesId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
        // waiting.close();
        var tagid = bytesToHexString(tag.getId());

        setTimeout(() => {
            uni.$emit("NFC_readID", tagid); //将值存储监听器
            tab.navigateBack(1); //返回上一级页面
            closeReadAndWrite();
        }, 1000);
    } catch (e) {
        uni.showToast({
            title: e,
            icon: "none",
        });
    }
}

function bytesToHexString(inarray) {
    var i, j, x;
    var hex = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"];
    var out = "";
    for (j = 0; j < inarray.length; ++j) {
        x = parseInt(inarray[j]) & 0xff;
        i = (x >> 4) & 0x0f;
        out += hex[i];
        i = x & 0x0f;
        out += hex[i];
    }
    return out;
}

function reverseTwo(str) {
    var str1 = "";
    for (var i = 1; i <= str.length; i++) {
        str1 += str[i - 1];
        if (i % 2 == 0) {
            if (i == str.length) {
                break;
            }
            str1 += ":";
        }
    }
    var str2 = "";
    for (var i = str1.split(":").length - 1; i >= 0; i--) {
        str2 += str1.split(":")[i];
    }
    return str2;
}

if (uni.getSystemInfoSync().platform == "android") {
    //plus.globalEvent.addEventListener('plusready', listenNFCStatus, false);
}

function writeData() {
    var textEle = plus.globalEvent.getElementById("text");
    if (!textEle.value) {
        uni.showToast({
            title: "请输入要写入的内容！",
            icon: "none",
        });
        return;
    }
    readyWriteData = true;
    settingStores().nfcWaiting = '请将手机靠近NFC标签'
    // waiting = plus.nativeUI.showWaiting("请将手机靠近NFC标签！");
}

function readData() {
    readyRead = true;
    settingStores().nfcWaiting = '请将手机靠近NFC标签'
    // waiting = plus.nativeUI.showWaiting("请将手机靠近NFC标签！", {
    //     modal: false,
    // });
}

function closeReadAndWrite() {
    readyWriteData = false;
    readyRead = false;

    if (waiting) {
        waiting.close();
    }
}