''' client for accessing avni api '''
# python 3 compatibility
from __future__ import absolute_import, division, print_function
import sys
if (sys.version_info[:2] < (3, 0)):
    from builtins import *
# imports for client:
import json,requests
import pandas as pd
from configobj import ConfigObj
from .. import tools
import os
[docs]class Client(object):
    def __init__(self,api_key='',timeout=300,api_init_file=None):
        '''
        Client class
        Input:
        ------
            api_key: the api_key to use. If not set, will try to find one
            api_init_file: if api_key is not set, this is the absolute path of
                the api config file. Only needed if setApiConfig() was
                called with api_init_file specified.
            timeout: default timeout in seconds for api call.
        '''
        self.timeout=timeout
        if api_key=='':
            self.key=self.searchForApiKey(api_init_file)
        else:
            self.key=api_key
        self.checkConnection()
        return
[docs]    def checkConnection(self):
        ''' checks if the avni api is accessible'''
        self.base_url=None
        connected=False
        for url in ['http://127.0.0.1:5000','http://maurya.umd.edu:41559']:
            if connected is False:
                try:
                    r = requests.get(url, timeout=self.timeout)
                except:
                    r = None
                if r is not None:
                    print("avni api is live at ")
                    print(url)
                    self.base_url=url
                    stats=self.checkUserStats()
                    print(stats['message'])
                    connected=True
        if self.base_url is None:
            print("no connection to avni api")
        return 
[docs]    def call(self,path,parameters=None,time_out=None):
        ''' general form for api calls, returns json as python dictionary '''
        url=self.base_url+path
        if time_out is None:
            time_out=self.timeout
        r = requests.get(url,params=parameters,timeout=time_out)
        return r.json() 
[docs]    def checkUserStats(self):
        '''
        checks stats for a user
        '''
        args={'key':self.key}
        output=json.loads(self.call('/checkuserstats',args))
        return output 
[docs]    def searchForApiKey(self,api_init_file=None):
        '''
        searches for API Key
        Input:
        ------
            api_init_file: the api.ini file full path. If None, will default to
                           looking in avni/config/api.ini
        Output:
        -------
            api_key: the api key. Empty string if not found
        '''
        parser=None
        api_key=''
        if api_init_file is None:
            api_init_file = os.path.join(tools.get_configdir(),'api.ini')
        if os.path.isfile(api_init_file):
            parser=ConfigObj(api_init_file)
            api_key=parser['API']['key']
        return api_key 
[docs]    def setApiConfig(self,api_key='',api_init_file=None):
        '''
        builds the api.ini file
        Input:
        ------
            api_key: the api key to store. Will pull from self.key if not
                     specified.
            api_init_file: the file to store key (subsequents calls to api will
                            need to specify the directory if not using the
                            default). Default is avni/config/api.ini
        Output:
        -------
            no output
        '''
        if api_key=='':
            if self.key=='':
                msg="No api key to set! Initialize Client with api_key or  "
                msg=msg+" call setApiConfig with api_key='APISTRING' "
                print(msg)
            else:
                api_key=self.key
        if api_init_file is None:
            api_init_file = os.path.join(tools.get_configdir(),'api.ini')
        if os.path.isfile(api_init_file):
            print(api_init_file+' already exists. Remove it to reset.')
        else:
            config = ConfigObj()
            config.filename = api_init_file
            config['API'] = {}
            config['API']['key'] = api_key
            config.write()
            print("API key stored in " + api_init_file)
        return