package acquire.sdk;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

import com.morefun.yapi.engine.DeviceInfoConstrants;
import com.morefun.yapi.engine.DeviceServiceEngine;

import acquire.base.BaseApplication;

public class YsdkDeviceServiceProvider implements DeviceServiceProvider{

    private static YsdkDeviceServiceProvider ysdkDeviceServiceProvider = null;

    private DeviceServiceEngine deviceServiceEngine = null;

    private IBinder iBinder = null;

    private final BaseApplication baseApplication;
    private YsdkDeviceServiceProvider(BaseApplication baseApplication) {
        this.baseApplication = baseApplication;
    }

    public static YsdkDeviceServiceProvider initialiseInstance(BaseApplication baseApplication) {
        ysdkDeviceServiceProvider = new YsdkDeviceServiceProvider(baseApplication);
        ysdkDeviceServiceProvider.bindDeviceService();
        return ysdkDeviceServiceProvider;
    }

    public void registerBusinessId() {
        try {
            Bundle bundle = new Bundle();
            int ret = DeviceHelper.getDeviceService().login(bundle, "09100000");
            if (ret != 0) {
                Log.d("YSDK", "login failed "  + ret);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    private void closeNfc() {
        try {
            Bundle bundle = new Bundle();
            bundle.putBoolean(DeviceInfoConstrants.SYSTEM_NFC_DISABLE, true);
            int ret = DeviceHelper.getDeviceService().setProperties(bundle);
            if (ret != 0) {
                Log.d("YSDK", "SYSTEM_NFC_DISABLE failed "  + ret);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static YsdkDeviceServiceProvider getInstance() {
        return ysdkDeviceServiceProvider;
    }

    @Override
    public DeviceServiceEngine getDeviceService() {
        return deviceServiceEngine;
    }


    @Override
    public void bindDeviceService() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    if (null != deviceServiceEngine) {
                        return;
                    }
                    Intent intent = new Intent();
                    intent.setAction("com.morefun.ysdk.service");
                    intent.setPackage("com.morefun.ysdk");
                    Log.e("bindDeviceService", "======bindService======");
                    boolean isBindSuccess = baseApplication.bindService(intent, ysdkConnection, Context.BIND_AUTO_CREATE);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }


    private final ServiceConnection ysdkConnection = new ServiceConnection() {
        @Override
        public void onServiceDisconnected(ComponentName name) {
            deviceServiceEngine = null;
            Log.e("YSDK", "======onServiceDisconnected======");
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            ysdkDeviceServiceProvider.deviceServiceEngine = DeviceServiceEngine.Stub.asInterface(service);
            iBinder = service;
            DeviceHelper.init(ysdkDeviceServiceProvider);
            registerBusinessId();
            closeNfc();
            Log.d("YSDK", "======onServiceConnected======");
            linkToDeath(service);
        }

        private void linkToDeath(IBinder service) {
            try {
                service.linkToDeath(() -> {
                    Log.d("YSDK", "======binderDied======");
                    deviceServiceEngine = null;
                    iBinder = null;
                    bindDeviceService();
                }, 0);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    };

}