#!/usr/bin/env python
'''
Copyright (c) 2020 Bixbit s.c. All rights reserved.
See LICENSE file for licensing information.
'''

import sys, argparse, os
import urllib.request, tarfile, requests

ansible_dir_link = "furms-devops-tooling"

class GitHubAsset:
   def __init__(self, asset_download_url, asset_name):
      self._download_url = asset_download_url
      self._name = asset_name

   def name(self):
      return self._name
   def download_url(self):
      return self._download_url
   def copressed_dir_name(self):
      return self._name.replace('.tar.gz' ,'')

class GitHubClient:
   def __init__(self):
      resp = requests.get("https://api.github.com/repos/unity-idm/furms-devops/releases/latest")
      self._asset = resp.json()["assets"][0]
   def asset(self):
      return GitHubAsset(self._asset["browser_download_url"], self._asset["name"])

def parse_arguments():
   parser = argparse.ArgumentParser(description='FURMS devops tools installation utility.')
   parser.add_argument('--install-dir', metavar='path', help='Install tooling under specified directory, \
         not required, current dir by default', action='store', default=os.getcwd())
   parser.add_argument('--version', help="Print the version of devos tools to be installed by this utility.",
      action='store_true')
   return parser.parse_args()

def download_package(download_url, target_file):
   urllib.request.urlretrieve(download_url, target_file)

def unpack_archive(archive_file, unpacked_target_dir):
   tar = tarfile.open(archive_file, "r:gz")
   tar.extractall(unpacked_target_dir)

def create_link(unpacked_target_dir, copressed_dir_name):
   pwd = os.getcwd()
   os.chdir(unpacked_target_dir)

   if os.path.exists(ansible_dir_link):
      os.unlink(ansible_dir_link)
   os.symlink(copressed_dir_name, ansible_dir_link)

   os.chdir(pwd)


def install_package(install_dir, asset):
   print("Installation of latest FURMS devops tools into %s" % (install_dir))
   os.makedirs(install_dir, exist_ok=True)

   compressed_target_file = os.path.join(install_dir, asset.name())
   download_package(asset.download_url(), compressed_target_file)

   unpacked_target_dir = os.path.dirname(os.path.abspath(compressed_target_file))
   unpack_archive(compressed_target_file, unpacked_target_dir)

   create_link(unpacked_target_dir, asset.copressed_dir_name())
   os.remove(compressed_target_file)

def current_version_upto_date(asset):
   if os.path.exists(ansible_dir_link):
      current_ansible_dir = os.readlink(ansible_dir_link)
      if current_ansible_dir == asset.copressed_dir_name():
         return True
   return False

def main():
   args = parse_arguments()

   asset = GitHubClient().asset()

   if args.version:
      print(asset.copressed_dir_name())
      exit(0)

   if current_version_upto_date(asset):
      print("Current version %s is up to date." % asset.copressed_dir_name())
      exit(0)

   if args.install_dir:
      install_package(args.install_dir, asset)

   print("Command finished successfully")

if __name__ == "__main__":
    main()