# -*- coding: utf-8 -*-
from email import message
import requests
import json
import hashlib

class JoinTech  :
    
    API_URL = "http://icloud.assetscontrols.com:8092/OpenApi"
    HEADER = {
        "Content-Type": "application/json"
    }
    REQUEST_ERROR = "ERROR - code: {code} - message: {message}"
    # FUserName = "SIMPLIFYSTACK"
    # FPassword = "SIM123"
    def send_request(self,url,data):
        r = requests.post(url,json = data, headers=self.HEADER)
        if r.status_code == 200:
            data = json.loads(r.text)
            FObject = data['FObject']#['FUserName']
           
            data =  FObject
        else :
            data =  self.REQUEST_ERROR.format(code = r.status_code, message = r.text)

        return data, r.status_code

    def login(self,FUserName,FPassword):

        #Pwd encoded in MD5
        FUserName = "SIMPLIFYSTACK"
        FPassword = "SIM12345"
        # FPassword = hashlib.md5(self.FPassword.encode('UTF-8')).hexdigest()
        FPassword = hashlib.md5(FPassword.encode('UTF-8')).hexdigest()
        # print(FPassword)
        url = '{}/login'.format(self.API_URL)
        payload = {
            'FUserName': FUserName,
            'FPassword': FPassword
        }
        # print('Amadou')
        data, status_code = self.send_request(url,payload)
        return data, status_code
        
    #same function for Vehicle/Container
    def get_device_infos(self,token,action):

        url = '{}/Admin'.format(self.API_URL)
        # FAction = 'QueryAdminAssetList'
        payload = {
            'FTokenID': token,
            'FAction': action
        }       
        FObject,status_code = self.send_request(url,payload)

        return FObject,status_code

    def get_real_time_data(self,token,FGUIDs,FType):

        url = '{}/LBS'.format(self.API_URL)
        FAction = 'QueryLBSMonitorListByFGUIDs'
        payload = {
            'FTokenID': token,
            'FAction': FAction,
            'FGUIDs': FGUIDs,
            'FType': FType
        }
        #FGUIDs: Unique identification of assets / device, multiple separated by ',' EX: 'BE2A1E27-B36E-4301-B2C8-465A62AD215F,FE0BDE75-4A30-4B9C-AD2E-66D8A4F44F5E'
        #Ftype 	1：assets 2：device
        FObject,status_code = self.send_request(url,payload)

        return FObject, status_code

    def get_historical_track_point_data(self,token,FGUId,FType,FAssetTypeID,FStartTime,FEndTime,FDateType):

        url = '{}/LBS'.format(self.API_URL)
        FAction = 'QueryLBSTrackListByFGUID'
        payload = {
            'FTokenID': token,
            'FAction': FAction,
            'FGUID': FGUId,
            'FType': FType,
            'FAssetTypeID': FAssetTypeID,
            'FStartTime': FStartTime,
            'FEndTime': FEndTime,
            'FLanguage': 0,
            'FDateType': FDateType

        }
        #FAssetTypeID: Device type
        #FLanguage : 1：Chinese 0：English
        #FDateType: 1：Query by receiving time；0：Query by GPS time
        FObject, status_code = self.send_request(url,payload)

        return FObject, status_code

    def send_unlock_command(self,token,FAssetGUID):

        url = '{}/Instruction'.format(self.API_URL)
        FAction = 'OpenLockControl'
        payload = {
            'FTokenID': token,
            'FAction': FAction,
            'FAssetGUID': FAssetGUID,
  
        }
    
        r = requests.post(url,json = payload, headers=self.HEADER)
        if r.status_code == 200:
            data = json.loads(r.text)
            # message = data['Message']#['FUserName']
            # data = message
        else :
            data =  self.REQUEST_ERROR.format(code = r.status_code, message = r.text)
        return data, r.status_code

    def query_unlock_status(self,token,FAssetGUID):

        url = '{}/Instruction'.format(self.API_URL)
        FAction = 'QueryLockStatus'
        payload = {
            'FTokenID': token,
            'FAction': FAction,
            'FAssetGUID': FAssetGUID,
  
        }
        r = requests.post(url,json = payload, headers=self.HEADER)
        if r.status_code == 200:
            data = json.loads(r.text)
            # message = data['Message']#['FUserName']
            # result = data['Ressage']#['FUserName']
            # data = {
            #         "result"
            # }
        else :
            data =  self.REQUEST_ERROR.format(code = r.status_code, message = r.text)

        return data, r.status_code 

    def open_close_dynamic_password(self,token,FAssetGUID,FStatus):

        url = '{}/Instruction'.format(self.API_URL)
        FAction = 'OpenCloseDynamicPassword'
        payload = {
            'FTokenID': token,
            'FAction': FAction,
            'FAssetGUID': FAssetGUID,
            'FStatus': FStatus
  
        }
        #FStatus: 1:Open；0：Close
        FObject, status_code = self.send_request(url,payload)

        return FObject, status_code

    def open_close_dynamic_password_status(self,token,FAssetGUID,FStatus):

        url = '{}/Instruction'.format(self.API_URL)
        FAction = 'QueryOpenCloseDynamicPasswordStatus'
        payload = {
            'FTokenID': token,
            'FAction': FAction,
            'FAssetGUID': FAssetGUID,
            'FStatus': FStatus

        }
        FObject, status_code = self.send_request(url,payload)

        return FObject, status_code

    def query_unlock_password(self,token,FGUIDs,FPageSize,FPageIndex):

        url = '{}/Instruction'.format(self.API_URL)
        FAction = 'QueryAssetPassword'
        payload = {
            'FTokenID': token,
            'FAction': FAction,
            'FGUIDs': FGUIDs,
            'FPageSize': FPageSize,
            'FPageIndex': FPageIndex

        }
        #FPageSize: Number of entries per page,default 10
        #FPageIndex: Current page number,default 1
        FObject, status_code = self.send_request(url,payload)

        return FObject, status_code

    def update_unlock_password(self,token,FAssetGUID,FNewPassword,FOldPassword):

        url = '{}/Instruction'.format(self.API_URL)
        FAction = 'QueryAssetPassword'
        payload = {
            'FTokenID': token,
            'FAction': FAction,
            'FAssetGUID': FAssetGUID,
            'FNewPassword': FNewPassword,
            'FOldPassword': FOldPassword

        }
        FObject, status_code = self.send_request(url,payload)

        return FObject, status_code

    def update_unlock_password_status(self,token,FAssetGUID):

        url = '{}/Instruction'.format(self.API_URL)
        FAction = 'QueryUpdateLockPasswordStatus'
        payload = {
            'FTokenID': token,
            'FAction': FAction,
            'FAssetGUID': FAssetGUID,
            'FLanguage': 1

        }
        FObject, status_code = self.send_request(url,payload)

        return FObject, status_code

    def query_command_list(self,token,FAssetGUID):

        url = '{}/Instruction'.format(self.API_URL)
        FAction = 'QuerySystemRemoteInstructions'
        payload = {
            'FTokenID': token,
            'FAction': FAction,
            'FAssetGUID': FAssetGUID,

        }
        FObject, status_code = self.send_request(url,payload)

        return FObject, status_code

    def send_command(self,token,FAssetGUID,FInsType):

        url = '{}/Instruction'.format(self.API_URL)
        FAction = 'CommandInstruction'
        payload = {
            'FTokenID': token,
            'FAction': FAction,
            'FAssetGUID': FAssetGUID,
            'FInsType': FInsType,

        }
        #FInsType: command type ==> more infos: http://icloud.assetscontrols.com:8181/docs/kTE5nadBmopN1iWh/kTE5nadBmopN1iWh-1dllhddsq9tcc

        FObject, status_code = self.send_request(url,payload)

        return FObject, status_code

    def query_send_record(self,token,FAssetGUID,FPageSize,FPageIndex):

        url = '{}/Instruction'.format(self.API_URL)
        FAction = 'QueryInstructionRecord'
        payload = {
            'FTokenID': token,
            'FAction': FAction,
            'FAssetGUID': FAssetGUID,
            'FPageSize': FPageSize,
            'FPageIndex': FPageIndex,

        }

        FObject, status_code = self.send_request(url,payload)

        return FObject, status_code

    def unlock_report(self,token,FGUIDs,FStartTime,FEndTime):

        url = '{}/Report'.format(self.API_URL)
        FAction = 'QueryReportOpenLockList'
        FSelectType = 0
        FDateType = 0
        payload = {
            'FTokenID': token,
            'FAction': FAction,
            'FGUIDs': FGUIDs,
            'FSelectType': FSelectType,
            'FStartTime': FStartTime,
            'FEndTime': FEndTime,
            'FDateType': FDateType

        }
        #FSelectType: 1：Query by assets；0：Query by device
        FObject, status_code = self.send_request(url,payload)

        return FObject, status_code

    def slave_track(self,token,FGUId,FSelectType,FStartTime,FEndTime):

        url = '{}/Report'.format(self.API_URL)
        FAction = 'QueryReportSubAssetTrack'
        payload = {
            'FTokenID': token,
            'FAction': FAction,
            'FGUID': FGUId,
            'FSelectType': FSelectType,
            'FStartTime': FStartTime,
            'FEndTime': FEndTime,

        }
        FObject, status_code = self.send_request(url,payload)

        return FObject, status_code

    def alarm_report(self,token,FGUIDs,FStartTime,FEndTime):

        url = '{}/Report'.format(self.API_URL)
        FAction = 'QueryMessageAlarmList'
        FSelectType = 0
        FDateType = 0
        FDataTypes = "42,46"
        payload = {
            'FTokenID': token,
            'FAction': FAction,
            'FGUIDs': FGUIDs,
            'FSelectType': FSelectType,
            'FStartTime': FStartTime,
            'FEndTime': FEndTime,
            'FDataTypes': FDataTypes,
            'FDateType': FDateType,

        }
        FObject, status_code = self.send_request(url,payload)

        return FObject, status_code

    def event_report(self,token,FGUIDs,FStartTime,FEndTime):

        url = '{}/Report'.format(self.API_URL)
        FAction = 'QueryMessageEventList'
        FDataTypes = "42,46"
        FDateType = 0
        FSelectType = 0
        payload = {
            'FTokenID': token,
            'FAction': FAction,
            'FGUIDs': FGUIDs,
            'FSelectType': FSelectType,
            'FStartTime': FStartTime,
            'FEndTime': FEndTime,
            'FDataTypes': FDataTypes,
            'FDateType': FDateType,

        }
        FObject, status_code = self.send_request(url,payload)

        return FObject, status_code

    def temperature_humidity_curve(self,token,FGUId,FStartTime,FEndTime):   

        url = '{}/Report'.format(self.API_URL)
        FAction = 'QueryReportTemperatureTrackNew'
        FSelectType = 1
        payload = {
            'FTokenID': token,
            'FAction': FAction,
            'FGUID': FGUId,
            'FSelectType': FSelectType,
            'FStartTime': FStartTime,
            'FEndTime': FEndTime,

        }
        FObject, status_code = self.send_request(url,payload)

        return FObject, status_code

    def single_device_infos(self,token,FAssetID):

        url = '{}/Admin'.format(self.API_URL)
        FAction = 'QueryAdminAssetByAssetId'
        payload = {
            'FTokenID': token,
            'FAction': FAction,
            'FAssetID': FAssetID,
            
        }
        FObject, status_code = self.send_request(url,payload)

        return FObject, status_code

    def single_asset_infos(self,token,FVehicleName):

        url = '{}/Admin'.format(self.API_URL)
        FAction = 'QueryAdminVehicleByVehicleName'
        payload = {
            'FTokenID': token,
            'FAction': FAction,
            'FVehicleName': FVehicleName,
            
        }
        FObject, status_code = self.send_request(url,payload)

        return FObject, status_code
