import requests
from requests.auth import HTTPBasicAuth
from ansible.module_utils.basic import *

bootstrap_filename = None
url = None

def store_bootstrap_script(filename, dest_directory, text):
    global file_path

    try:
        os.mkdir(dest_directory)
    except OSError:
        pass

    file_path = dest_directory + '/' + filename
    script_file = open(file_path, 'w')
    script_file.write(text)
    script_file.close()


def set_bootstrap_filename(version=None):
    global bootstrap_filename
    if version == '4.16.01' or version is None:
        bootstrap_filename = 'bootstrap.sh'
    else:
        bootstrap_filename = 'bootstrap_' + version + '.sh'


def download_bootstrap(uri, dest_directory, user_name=None, password=None):
    auth = None
    if user_name is not None and password is not None:
        auth = HTTPBasicAuth(user_name, password)
    url = uri + '/' + bootstrap_filename
    resp = requests.get(url, auth=auth)
    store_bootstrap_script(bootstrap_filename, dest_directory, resp.text)
    return resp.status_code


def main():
    module = AnsibleModule(
            argument_spec=dict(
                    url=dict(required=False, type='str', default='http://software.apigee.com'),
                    version=dict(required=False, type='str', choices=['4.16.01', '4.16.05', '4.16.09', '4.17.01'], default='4.16.01'),
                    dest_dir=dict(required=False, type='str', default='/tmp'),
                    user_name = dict(required=False, type='str'),
                    password = dict(required=False, type='str')
            )
    )

    bootstrap_uri = module.params['url']
    version = module.params['version']
    dest = module.params['dest_dir']
    user_name = module.params['user_name']
    password = module.params['password']

    set_bootstrap_filename(version)

    status_code = download_bootstrap(bootstrap_uri, dest, user_name, password)

    if status_code >= 200 and status_code < 300:
        module.exit_json(changed=True,
                         ansible_facts=dict(
                                 rc=0,
                                 bootstrap_request_status_code=status_code,
                                 bootstrap_script=file_path,
                                 bootstrap_filename=bootstrap_filename,
                                 bootstrap_version=version
                         )
                         )
    elif status_code >= 400:
        module.fail_json(changed=False,
                         msg="Failed to retrieve bootstrap script",
                         rc=1,
                         bootstrap_request_status_code=status_code,
                         bootstrap_version=version
                         )


if __name__ == '__main__':
    main()
