package com.wmdigit.service;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.os.IBinder;
import android.os.RemoteException;

import com.wmdigit.common.model.ProductsDTO;
import com.wmdigit.service.aidl.model.DetectResult;
import com.wmdigit.service.listener.OnServiceConnectListener;

import java.util.List;

/**
 * WmSdk类,实现了WmSdkInterface接口,提供了与服务端进行通信的功能
 * @author dizi
 */
public class WmSdk implements WmSdkInterface{

    /**
     * 服务包名,用于绑定服务
     */
    private static final String SERVICE_PACKAGE = "com.wmdigit.cateringdetect";
    /**
     * 服务动作,用于绑定服务
     */
    private static final String SERVICE_ACTION = "com.wmdigit.service";
    /**
     * WmSdk的单例实例
     */
    private static WmSdk instance;
    /**
     * 获取WmSdk的单例实例
     * @return WmSdk的实例
     */
    public static WmSdk getInstance(){
        if (instance == null){
            synchronized (WmSdk.class){
                if (instance == null){
                    instance = new WmSdk();
                }
            }
        }
        return instance;
    }

    /**
     * 应用程序上下文
     */
    private Context context;
    /**
     * AIDL接口对象
     */
    private ICateringInterface aidlInterface;
    /**
     * 服务连接监听器
     */
    private OnServiceConnectListener onServiceConnectListener;

    private boolean isServiceConnected = false;

    /**
     *  DeathRecipient用于处理aidl接口对象的死亡消息
     */
    private final IBinder.DeathRecipient deathRecipient = new IBinder.DeathRecipient() {
        @Override
        public void binderDied() {
            if (aidlInterface != null) {
                aidlInterface.asBinder().unlinkToDeath(this, 0);
            }
        }
    };

    /**
     * ServiceConnection对象,用于处理与服务的连接和断开连接
     */
    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            isServiceConnected = true;
            aidlInterface = ICateringInterface.Stub.asInterface(service);
            // 注册DeathRecipient
            try {
                aidlInterface.asBinder().linkToDeath(deathRecipient, 0);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
            if (onServiceConnectListener != null){
                onServiceConnectListener.onConnected(name, service);
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            isServiceConnected = false;
            if (onServiceConnectListener != null){
                onServiceConnectListener.onDisconnected(name);
            }
        }
    };

    /**
     * 绑定服务
     * @param context 应用程序上下文
     * @param listener 服务连接监听器,用于处理服务连接状态的变化
     */
    @Override
    public void bindService(Context context, OnServiceConnectListener listener) {
        this.context = context;
        this.onServiceConnectListener = listener;
        Intent intent = new Intent();
        intent.setPackage(SERVICE_PACKAGE);
        intent.setAction(SERVICE_ACTION);
        context.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
    }

    /**
     * 解绑服务
     */
    @Override
    public void unbindService() {
        if (serviceConnection != null){
            context.unbindService(serviceConnection);
        }
    }

    /**
     * 初始化SDK
     * @param listener 初始化监听器,用于处理初始化过程中的回调
     */
    @Override
    public void init(IOnInitListener listener) {
        try {
            aidlInterface.init(listener);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 导入产品数据
     * @param products 产品数据列表
     */
    @Override
    public void importProducts(List<ProductsDTO> products) {
        try {
            aidlInterface.importProducts(products);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 注册检测监听器
     * @param generateBitmap 是否生成位图
     * @param listener 检测监听器,用于处理检测过程中的回调
     */
    @Override
    public void registerDetectionListener(boolean generateBitmap, IOnDetectionListener listener) {
        try {
            aidlInterface.registerDetectionListener(generateBitmap, listener);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 取消注册检测监听器
     */
    @Override
    public void unregisterDetectionListener() {
        try {
            aidlInterface.unregisterDetectionListener();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 自动检测
     * @param generateBitmap 是否生成位图
     * @return 检测结果
     */
    @Override
    public DetectResult autoDetect(boolean generateBitmap) {
        DetectResult detectResult = null;
        try {
            detectResult = aidlInterface.autoDetect(generateBitmap);
        } catch (Exception e){
            e.printStackTrace();
        }
        return detectResult;
    }

    /**
     * 检查服务应用是否已安装
     *
     * @param context Android上下文,用于访问包管理器以查询应用安装状态
     * @return 如果服务应用已安装,则返回true;否则返回false
     */
    @Override
    public boolean checkServiceAppInstalled(Context context) {
        try{
            // 尝试获取服务应用的包信息
            context.getPackageManager().getPackageInfo(SERVICE_PACKAGE, 0);
        }
        catch (PackageManager.NameNotFoundException e){
            // 如果未找到包,则服务应用未安装
            return false;
        }
        // 如果成功获取到包信息,则服务应用已安装
        return true;
    }

    /**
     * 检查与服务的连接状态
     *
     * @return 如果服务连接已建立,则返回true;否则返回false
     */
    @Override
    public boolean checkServiceConnected() {
        // 返回当前的服务连接状态
        return isServiceConnected;
    }
    /**
     * 检查激活状态
     * @return 激活状态,true表示已激活,false表示未激活
     */
    @Override
    public boolean checkActivation() {
        boolean result = false;
        try {
            result = aidlInterface.checkActivation();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 检查相机裁剪功能
     * @return 相机裁剪功能状态,true表示支持,false表示不支持
     */
    @Override
    public boolean checkCameraCrop() {
        boolean result = false;
        try{
            result = aidlInterface.checkCameraCrop();
        } catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 检查学习数据是否已初始化
     * @return 学习数据初始化状态,true表示已初始化,false表示未初始化
     */
    @Override
    public boolean checkLearningDataInitCompleted() {
        boolean result = false;
        try{
            result = aidlInterface.checkLearningDataInited();
        } catch (Exception e){
          e.printStackTrace();
        }
        return result;
    }

    /**
     * 打开设置页面
     */
    @Override
    public void openSettingPage() {
        try {
            aidlInterface.openSettingPage();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 重置相机背景
     */
    @Override
    public void resetCameraBackground() {
        try {
            aidlInterface.resetCameraBackground();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}