import requests
from requests import ConnectionError
from requests.exceptions import RequestException
import sys
from requests.auth import HTTPBasicAuth
from ansible.module_utils.basic import *

BASE_SERVER_URL = 'http://localhost'
SERVER_SELF_URI = '/v1/servers/self'
SERVER_PORTS = {'ms': '8080',
                'router': '8081',
                'r': '8081',
                'mp': '8082',
                'rmp': '8082',
                'qs': '8083',
                'ps': '8084'}


def get_server_self(server_type, username, password):
    auth = HTTPBasicAuth(username, password)
    url = BASE_SERVER_URL + ':' + SERVER_PORTS[server_type] + SERVER_SELF_URI
    resp = requests.get(url, auth=auth)
    return resp


def map_server_self(server_self):
    reported = server_self.json()
    for p in reported['tags']['property']:
        name = p['name']
        value = p['value']
        reported[name] = value
    del reported['tags']
    return reported


def main():
    module = AnsibleModule(
            argument_spec=dict(
                    username=dict(required=True, type='str', no_log=True),
                    password=dict(required=True, type='str', no_log=True),
                    server_type=dict(required=True, type='str', choices=['ms', 'router', 'r', 'mp', 'qs', 'ps', 'rmp'])
            )
    )

    username = module.params['username']
    password = module.params['password']
    server_type = module.params['server_type']
    try:
        resp = get_server_self(server_type, username, password)
        status_code = resp.status_code
    except RequestException as ex:
        status_code = 500
        msg = str(ex) + " Did you run on the correct server?"
        print(msg)

    if status_code >= 200 and status_code < 300:
        server_self = map_server_self(resp)
        facts = {}
        facts['edge_' + server_type + '_self'] = server_self
        module.exit_json(
                changed=True,
                ansible_facts=facts
        )
    elif status_code > 400:
        err_msg = "Error status code returned: ["
        if 'msg' in globals():
            err_msg += msg
        module.fail_json(
                changed=False,
                msg=err_msg,
                status_code=status_code,
        )


if __name__ == '__main__':
    main()
