#!/usr/bin/env python
import optparse
import os
import shutil
import sys

"""
This script installs the session-manager-plugin for macOS.
The executable is installed to /usr/local/sessionmanagerplugin (default) or to an install directory provided by the user.
It also creates a symlink session-manager-plugin in the /usr/local/bin directory
"""

PLUGIN_FILE = "session-manager-plugin"
VERSION_FILE = "VERSION"
LICENSE_FILE = "LICENSE"
SEELOG_FILE = "seelog.xml.template"

INSTALL_DIR = "/usr/local/sessionmanagerplugin"
SYMLINK_NAME = "/usr/local/bin/{}".format(PLUGIN_FILE)

def create_symlink(real_location, symlink_name):
    """
    Removes a duplicate symlink if it exists and
    creates symlink from real_location to symlink_name
    """
    if os.path.isfile(symlink_name):
        print("Symlink already exists. Removing symlink from {}".format(symlink_name))
        os.remove(symlink_name)

    print("Creating Symlink from {} to {}".format(real_location, symlink_name))
    os.symlink(real_location, symlink_name)

def main():
    parser = optparse.OptionParser()
    parser.add_option("-i", "--install-dir", help="The location to install the Session Manager Plugin."
                    " The default value is {}".format(INSTALL_DIR), default=INSTALL_DIR)
    parser.add_option("-b", "--bin-location", help="If this argument is "
                      "provided, then a symlink will be created at this "
                      "location that points to the session-manager-plugin executable. "
                      "The default symlink location is {}\n"
                      "Note: The session-manager-plugin executable must be in your $PATH "
                      "to use Session Manager Plugin with AWS CLI.".format(SYMLINK_NAME), default=SYMLINK_NAME)
    options = parser.parse_args()[0]

    try:
        current_working_directory = os.path.dirname(os.path.abspath(__file__))

        current_bin_folder = os.path.join(current_working_directory, 'bin')
        install_bin_folder = os.path.join(options.install_dir, 'bin')

        if not os.path.isdir(install_bin_folder):
             print("Creating install directories: {}".format(install_bin_folder))
             os.makedirs(install_bin_folder)

        # Copy executable. Overwrites file if it exists. The basename of the file is copied
        current_bin_location = os.path.join(current_working_directory, 'bin', PLUGIN_FILE)
        shutil.copy2(current_bin_location, install_bin_folder)
        current_bin_folder = install_bin_folder

        # Copy see_log file
        seelog_location = os.path.join(current_working_directory, SEELOG_FILE)
        shutil.copy2(seelog_location, options.install_dir)

        # Copy Version File
        version_file_location = os.path.join(current_working_directory, VERSION_FILE)
        shutil.copy2(version_file_location, options.install_dir)

        # Copy License File
        license_file_location = os.path.join(current_working_directory, LICENSE_FILE)
        shutil.copy2(license_file_location, options.install_dir)

        install_bin_location = os.path.join(options.install_dir,'bin', PLUGIN_FILE)
        create_symlink(install_bin_location, options.bin_location)
        print("Installation successful!")
    except:
       print("Failed to create symlink.\nPlease add {} to your $PATH to use Session Manager Plugin.".format(current_bin_folder))

if __name__ == '__main__':
    main()
