from __future__ import print_function

import sys
import os.path
import json
import subprocess
import globals
import argparse

homeFolder = os.path.expanduser("~")
scriptFolder = os.path.dirname(os.path.realpath(__file__))

userConfigFilename = ".cram_user_facilities.cfg"
globalConfigFilename = "facilities.cfg"

userConfigFile = os.path.join(homeFolder, userConfigFilename)
globalConfigFile = os.path.join(scriptFolder, globalConfigFilename)

def getFacilityConfigFiles():
    return {'user': userConfigFile , 'global': globalConfigFile}

def createUserFacilityConfig(**kwargs):
        if userConfigExists():
            return

        with open(globalConfigFile, 'r') as facilityfp:
             facilityConfig = json.load(facilityfp)
        newFacilities = [facility for facility in facilityConfig if hasPermission(facility)]

        with open(userConfigFile, 'w') as userconfigfp:
                  json.dump(newFacilities, userconfigfp, indent=4)

def hasPermission(facility):
    ssh = facility['ssh']
    mfHelperPath = 'multi_facility_process_helper.py'
    if facility.get('gateway') is not None:
        conargs = ['ssh', facility['gateway'], 'ssh -o BatchMode=yes ', ssh, mfHelperPath]
    else:
        conargs = ['ssh', ssh, '-o BatchMode=yes', mfHelperPath]
    try:
        proc = subprocess.Popen(conargs,
                                stdin=subprocess.PIPE,
                                stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE)
        proc.communicate(json.dumps([('ls',{})]))
        if proc.returncode != 0:
            if globals.verbose:
                print('No permission on %s %d' % (facility['name'], proc.returncode))
            return False
    except subprocess.CalledProcessError:
        if globals.verbose:
            print('Cannot open subprocess for  %s' % facility['name'])
        return False
    if globals.verbose:
        print("Adding %s to user's facilities" % facility['name'])
    return True

def userConfigExists():
    if os.path.isfile(userConfigFile):
        return True
    else:
        return False

def clean():
    if userConfigExists():
        os.remove(userConfigFile)

def execute(args):
    parser = argparse.ArgumentParser(prog="cram push",
                                     description="Creates a local copy of facilities.cfg namely ~/.cram_user_facilities.cfg, this local copy excludes facilities the user does not have permission to use")
    parser.add_argument('-v', '--verbose', action='store_true', help='Enable verbose logging')
    args = parser.parse_args(args)
    globals.verbose = args.verbose

    with open(globalConfigFile, 'r') as facilityfp:
        facilityConfig = json.load(facilityfp)
    newFacilities = [facility for facility in facilityConfig if hasPermission(facility)]
    with open(userConfigFile, 'w') as userconfigfp:
        json.dump(newFacilities, userconfigfp, indent=4)


if __name__ == "__main__":
    execute(sys.argv[1:])
