package com.common.openapi;

import com.common.openapi.entity.CloudRecordsData;
import com.common.openapi.entity.ControlMovePTZData;
import com.common.openapi.entity.DeviceAlarmStatusData;
import com.common.openapi.entity.DeviceChannelInfoData;
import com.common.openapi.entity.DeviceDetailListData;
import com.common.openapi.entity.DeviceListData;
import com.common.openapi.entity.DeviceModifyNameData;
import com.common.openapi.entity.DeviceUnBindData;
import com.common.openapi.entity.DeviceVersionListData;
import com.common.openapi.entity.LocalRecordsData;
import com.common.openapi.entity.SubAccountDeviceData;
import com.google.gson.JsonObject;
import com.mm.android.deviceaddmodule.LCDeviceEngine;
import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.BusinessException;
import com.mm.android.deviceaddmodule.openapi.HttpSend;

import java.util.HashMap;

public class DeviceInfoOpenApiManager {

    private static int TIME_OUT = 10 * 1000;
    private static int DMS_TIME_OUT = 45 * 1000;

    /**
     * 分页获取乐橙app添加或分享的设备通道基本信息
     *
     * @param deviceListData
     * @return
     * @throws BusinessException
     */
    public static DeviceListData.Response deviceBaseList(DeviceListData deviceListData) throws BusinessException {
        HashMap<String, Object> paramsMap = new HashMap<String, Object>();
        paramsMap.put("token", LCDeviceEngine.newInstance().subAccessToken);
        paramsMap.put("bindId", deviceListData.data.baseBindId);
        paramsMap.put("limit", deviceListData.data.limit);
        paramsMap.put("type", deviceListData.data.type);
        paramsMap.put("needApInfo", deviceListData.data.needApInfo);
        JsonObject json = HttpSend.execute(paramsMap, MethodConst.METHOD_DEVICE_BASE_LIST,TIME_OUT);
        DeviceListData.Response response = new DeviceListData.Response();
        response.parseData(json);
        return response;
    }

    /**
     * 分页获取开放平台添加设备的通道基本信息
     *
     * @param deviceListData
     * @return
     * @throws BusinessException
     */
    public static DeviceListData.Response deviceOpenList(DeviceListData deviceListData) throws BusinessException {
        HashMap<String, Object> paramsMap = new HashMap<String, Object>();
        paramsMap.put("token", LCDeviceEngine.newInstance().subAccessToken);
        paramsMap.put("bindId", deviceListData.data.openBindId);
        paramsMap.put("limit", deviceListData.data.limit);
        paramsMap.put("type", deviceListData.data.type);
        paramsMap.put("needApInfo", deviceListData.data.needApInfo);
        JsonObject json = HttpSend.execute(paramsMap, MethodConst.METHOD_DEVICE_OPEN_LIST,TIME_OUT);
        DeviceListData.Response response = new DeviceListData.Response();
        response.parseData(json);
        return response;
    }

    /**
     * 批量根据设备序列号、通道号列表和配件号列表,获取设备的详细信息
     *
     * @param deviceDetailListData
     * @return
     * @throws BusinessException
     */
    public static DeviceDetailListData.Response deviceOpenDetailList(DeviceDetailListData deviceDetailListData) throws BusinessException {
        HashMap<String, Object> paramsMap = new HashMap<String, Object>();
        paramsMap.put("token", LCDeviceEngine.newInstance().subAccessToken);
        paramsMap.put("deviceList", deviceDetailListData.data.deviceList);
        JsonObject json = HttpSend.execute(paramsMap, MethodConst.METHOD_DEVICE_OPEN_DETAIL_LIST,TIME_OUT);
        DeviceDetailListData.Response response = new DeviceDetailListData.Response();
        response.parseData(json);
        return response;
    }

    /**
     * 批量根据设备序列号、通道号列表和配件号列表,获取乐橙app添加或分享的设备的详细信息
     *
     * @param deviceDetailListData
     * @return
     * @throws BusinessException
     */
    public static DeviceDetailListData.Response deviceBaseDetailList(DeviceDetailListData deviceDetailListData) throws BusinessException {
        HashMap<String, Object> paramsMap = new HashMap<String, Object>();
        paramsMap.put("token", LCDeviceEngine.newInstance().subAccessToken);
        paramsMap.put("deviceList", deviceDetailListData.data.deviceList);
        JsonObject json = HttpSend.execute(paramsMap, MethodConst.METHOD_DEVICE_BASE_DETAIL_LIST,TIME_OUT);
        DeviceDetailListData.Response response = new DeviceDetailListData.Response();
        response.parseData(json);
        return response;
    }

    /**
     * 解绑设备
     *
     * @param deviceUnBindData
     * @return
     * @throws BusinessException
     */
    public static boolean unBindDevice(DeviceUnBindData deviceUnBindData) throws BusinessException {
        // 解绑设备
        HashMap<String, Object> paramsMap = new HashMap<String, Object>();
        paramsMap.put("token", LCDeviceEngine.newInstance().accessToken);
        paramsMap.put("deviceId", deviceUnBindData.data.deviceId);
        HttpSend.execute(paramsMap, MethodConst.METHOD_DEVICE_UN_BIND,TIME_OUT);
        return true;
    }

    public static boolean deletePermission(String deviceId,String channelId) throws BusinessException{
        HashMap<String, Object> paramsMap = new HashMap<String, Object>();
        paramsMap.put("openid", LCDeviceEngine.newInstance().openid);
        paramsMap.put("channelId", channelId);
        paramsMap.put("token", LCDeviceEngine.newInstance().accessToken);
        paramsMap.put("deviceId", deviceId);
        HttpSend.execute(paramsMap, MethodConst.DELETE_DEVICE_PERMISSION,TIME_OUT);
        return true;
    }

    public static boolean recoverSDCard(String deviceId) throws BusinessException{
        HashMap<String, Object> paramsMap = new HashMap<String, Object>();
        paramsMap.put("token", LCDeviceEngine.newInstance().accessToken);
        paramsMap.put("deviceId", deviceId);
        HttpSend.execute(paramsMap, MethodConst.RECOVER_SDCARD,TIME_OUT);
        return true;
    }

    /**
     * 获取设备版本和可升级信息
     *
     * @param deviceVersionListData
     * @return
     * @throws BusinessException
     */
    public static DeviceVersionListData.Response deviceVersionList(DeviceVersionListData deviceVersionListData) throws BusinessException {
        HashMap<String, Object> paramsMap = new HashMap<String, Object>();
        paramsMap.put("token", LCDeviceEngine.newInstance().subAccessToken);
        paramsMap.put("deviceIds", deviceVersionListData.data.deviceIds);
        JsonObject json = HttpSend.execute(paramsMap, MethodConst.METHOD_DEVICE_VERSION_LIST,TIME_OUT);
        DeviceVersionListData.Response response = new DeviceVersionListData.Response();
        response.parseData(json);
        return response;
    }

    /**
     * 修改设备或通道名称
     *
     * @param deviceModifyNameData
     * @return
     * @throws BusinessException
     */
    public static boolean modifyDeviceName(DeviceModifyNameData deviceModifyNameData) throws BusinessException {
        // 解绑设备
        HashMap<String, Object> paramsMap = new HashMap<String, Object>();
        paramsMap.put("token", LCDeviceEngine.newInstance().subAccessToken);
        paramsMap.put("deviceId", deviceModifyNameData.data.deviceId);
        paramsMap.put("channelId", deviceModifyNameData.data.channelId);
        paramsMap.put("name", deviceModifyNameData.data.name);
        HttpSend.execute(paramsMap, MethodConst.METHOD_DEVICE_MODIFY_NAME,TIME_OUT);
        return true;
    }

    /**
     * 单个设备通道的详细信息获取
     *
     * @param deviceChannelInfoData
     * @return
     * @throws BusinessException
     */
    public static DeviceChannelInfoData.Response bindDeviceChannelInfo(DeviceChannelInfoData deviceChannelInfoData) throws BusinessException {
        // 单个设备通道的详细信息获取
        HashMap<String, Object> paramsMap = new HashMap<String, Object>();
        paramsMap.put("token", LCDeviceEngine.newInstance().subAccessToken);
        paramsMap.put("deviceId", deviceChannelInfoData.data.deviceId);
        paramsMap.put("channelId", deviceChannelInfoData.data.channelId);
        JsonObject json = HttpSend.execute(paramsMap, MethodConst.METHOD_DEVICE_CHANNEL_INFO, DMS_TIME_OUT);
        DeviceChannelInfoData.Response response = new DeviceChannelInfoData.Response();
        response.parseData(json);
        return response;
    }

    /**
     * 设置动检开关
     *
     * @param deviceAlarmStatusData
     * @return
     * @throws BusinessException
     */
    public static boolean modifyDeviceAlarmStatus(DeviceAlarmStatusData deviceAlarmStatusData) throws BusinessException {
        // 解绑设备
        HashMap<String, Object> paramsMap = new HashMap<String, Object>();
        paramsMap.put("token", LCDeviceEngine.newInstance().subAccessToken);
        paramsMap.put("deviceId", deviceAlarmStatusData.data.deviceId);
        paramsMap.put("channelId", deviceAlarmStatusData.data.channelId);
        paramsMap.put("enable", deviceAlarmStatusData.data.enable);
        HttpSend.execute(paramsMap, MethodConst.METHOD_DEVICE_MODIFY_ALARM_STATUS, DMS_TIME_OUT);
        return true;
    }

    /**
     * 设备升级
     *
     * @param deviceId
     * @return
     * @throws BusinessException
     */
    public static boolean upgradeDevice(String deviceId) throws BusinessException {
        // 解绑设备
        HashMap<String, Object> paramsMap = new HashMap<String, Object>();
        paramsMap.put("token", LCDeviceEngine.newInstance().subAccessToken);
        paramsMap.put("deviceId", deviceId);
        try{
            JsonObject execute = HttpSend.execute(paramsMap, MethodConst.METHOD_DEVICE_UPDATE, DMS_TIME_OUT);
            if(execute!=null){
                return true;
            }else{
                return false;
            }
        }catch (Exception e){
            return false;
        }


    }

    /**
     * 倒序查询设备云录像片段
     *
     * @param cloudRecordsData
     * @return
     * @throws BusinessException
     */
    public static CloudRecordsData.Response getCloudRecords(CloudRecordsData cloudRecordsData) throws BusinessException {
        // 倒序查询设备云录像片段
        HashMap<String, Object> paramsMap = new HashMap<String, Object>();
        paramsMap.put("token", LCDeviceEngine.newInstance().subAccessToken);
        paramsMap.put("deviceId", cloudRecordsData.data.deviceId);
        paramsMap.put("channelId", cloudRecordsData.data.channelId);
        paramsMap.put("beginTime", cloudRecordsData.data.beginTime);
        paramsMap.put("endTime", cloudRecordsData.data.endTime);
//        paramsMap.put("nextRecordId", cloudRecordsData.data.nextRecordId);
        paramsMap.put("count", cloudRecordsData.data.count);
        JsonObject json = HttpSend.execute(paramsMap, MethodConst.METHOD_GET_CLOUND_RECORDS,TIME_OUT);
        CloudRecordsData.Response response = new CloudRecordsData.Response();
        response.parseData(json);
        return response;
    }

    /**
     * 查询设备设备录像片段
     *
     * @param localRecordsData
     * @return
     * @throws BusinessException
     */
    public static LocalRecordsData.Response queryLocalRecords(LocalRecordsData localRecordsData) throws BusinessException {
        // 查询设备设备录像片段
        HashMap<String, Object> paramsMap = new HashMap<String, Object>();
        paramsMap.put("token", LCDeviceEngine.newInstance().subAccessToken);
        paramsMap.put("deviceId", localRecordsData.data.deviceId);
        paramsMap.put("channelId", localRecordsData.data.channelId);
        paramsMap.put("beginTime", localRecordsData.data.beginTime);
        paramsMap.put("endTime", localRecordsData.data.endTime);
        paramsMap.put("type", localRecordsData.data.type);
        paramsMap.put("queryRange", localRecordsData.data.queryRange);
        JsonObject json = HttpSend.execute(paramsMap, MethodConst.METHOD_QUERY_LOCAL_RECORD, DMS_TIME_OUT);
        LocalRecordsData.Response response = new LocalRecordsData.Response();
        response.parseData(json);
        return response;
    }

    public static int queryCloudUse(String deviceId,String channelId) throws BusinessException{
        HashMap<String, Object> paramsMap = new HashMap<String, Object>();
        paramsMap.put("token", LCDeviceEngine.newInstance().subAccessToken);
        paramsMap.put("deviceId", deviceId);
        paramsMap.put("channelId", channelId);
        JsonObject json = HttpSend.execute(paramsMap, MethodConst.GET_DEVICE_CLOUD, DMS_TIME_OUT);
        Integer state = json.get("strategyStatus").getAsInt();
        return state;
    }

    public static String  querySDState(String deviceId) throws BusinessException{
        HashMap<String, Object> paramsMap = new HashMap<String, Object>();
        paramsMap.put("token", LCDeviceEngine.newInstance().subAccessToken);
        paramsMap.put("deviceId", deviceId);
        JsonObject json = HttpSend.execute(paramsMap, MethodConst.SD_STATUE_QUERY, DMS_TIME_OUT);
        String state = json.get("status").getAsString();
        return state;
    }

    /**
     * 云台移动控制接口(V2版本)
     *
     * @param controlMovePTZData
     * @return
     * @throws BusinessException
     */
    public static void controlMovePTZ(ControlMovePTZData controlMovePTZData) throws BusinessException {
        // 云台移动控制接口(V2版本)
        HashMap<String, Object> paramsMap = new HashMap<String, Object>();
        paramsMap.put("token", LCDeviceEngine.newInstance().subAccessToken);
        paramsMap.put("deviceId", controlMovePTZData.data.deviceId);
        paramsMap.put("channelId", controlMovePTZData.data.channelId);
        paramsMap.put("operation", controlMovePTZData.data.operation);
        paramsMap.put("duration", controlMovePTZData.data.duration);
        HttpSend.execute(paramsMap, MethodConst.METHOD_CONTROL_MOVE_PTZ, DMS_TIME_OUT);
    }

    /**
     * 删除设备云录像片段
     *
     * @param recordRegionId
     * @return
     * @throws BusinessException
     */
    public static boolean deleteCloudRecords(String recordRegionId) throws BusinessException {
        // 删除设备云录像片段
        HashMap<String, Object> paramsMap = new HashMap<String, Object>();
        paramsMap.put("token", LCDeviceEngine.newInstance().subAccessToken);
        paramsMap.put("recordRegionId", recordRegionId);
        HttpSend.execute(paramsMap, MethodConst.METHOD_DELETE_CLOUND_RECORDS,TIME_OUT);
        return true;
    }

    //V7.12新增
    public static SubAccountDeviceData.Response getSubAccountDeviceListLight(int pageNo, int pageSize, String openid)throws BusinessException{
        HashMap<String, Object> paramsMap = new HashMap<String, Object>();
        paramsMap.put("token", LCDeviceEngine.newInstance().accessToken);
        paramsMap.put("pageNo", pageNo);
        paramsMap.put("pageSize",pageSize);
        paramsMap.put("openid",openid);
        JsonObject json = HttpSend.execute(paramsMap, MethodConst.LIST_SUB_ACCOUNT_DEVICE,TIME_OUT);
        SubAccountDeviceData.Response response = new SubAccountDeviceData.Response();
        response.parseData(json);
        return  response;
    }

    public static DeviceDetailListData.Response getSubAccountDeviceList(int pageNo, int pageSize)throws BusinessException{
        HashMap<String, Object> paramsMap = new HashMap<String, Object>();
        paramsMap.put("token", LCDeviceEngine.newInstance().subAccessToken);
        paramsMap.put("page", pageNo);
        paramsMap.put("pageSize",pageSize);
        JsonObject json = HttpSend.execute(paramsMap, MethodConst.SUB_ACCOUNT_DEVICE_LIST,TIME_OUT);
        DeviceDetailListData.Response response = new DeviceDetailListData.Response();
        response.parseData(json);
        return  response;
    }

}