#!/usr/bin/env python3
# (c) LEAP Encryption Access Project 2020
# License: GPL

import string
import subprocess
import sys
import os

VENDOR_PATH = None
PROVIDER=None
SCRIPT_NAME = sys.argv[0]
CA_README = "CERT.Readme"
ASSETS_README = "assets/FILES.Readme"
VENDOR_QRC = "vendor.qrc"

def initVendor():
    global VENDOR_PATH
    if not VENDOR_PATH:
        bail("ERROR: Please set VENDOR_PATH environment variable.")
    VENDOR_PATH = os.path.abspath(VENDOR_PATH)
    if os.path.isdir(VENDOR_PATH):
        bail("ERROR: VENDOR_PATH folder already exists {path}".format(path=VENDOR_PATH))

    for d in ["assets"]:
        os.makedirs(os.path.join(VENDOR_PATH, d))

    initVendorConfig()
    initGitRepo() 
    displayRepoInfo()

def displayRepoInfo():
    print()
    print("[+] Initialized repo in", VENDOR_PATH)
    print()
    print(f"- Please add all the needed assets. See {VENDOR_PATH}/{ASSETS_README}.")
    print(f"- Add your provider's CA certificate, see see {VENDOR_PATH}/{PROVIDER}/{CA_README}.")
    print("- Remember to commit your changes.")
    print()
    print("[+] After doing that, you can run 'make vendor_check' to validate the configuration for your provider.")

def bail(msg=None):
    if not msg:
        print("ERROR: no arguments supported!")
        print('Usage: {scriptname}'.format(
            scriptname=SCRIPT_NAME))
    else:
        print(msg)
    sys.exit(1)

def getVendorPath():
    return os.environ.get('VENDOR_PATH')

def sanitize(word):
    result = "" 
    for letter in word: 
        if letter in string.ascii_letters:
            result = result + letter.lower() 
    return result

def getProvider():
    provider = os.environ.get('PROVIDER')
    if not provider:
        provider = input('>   provider name? ')
        provider = sanitize(provider)
        print("[+] provider name:", provider)
    return provider

def getProviderURL():
    url = os.environ.get('PROVIDER_URL')
    if not url :
        url = input('>   provider url?: https://')
    return url.replace('https://', '').replace('/', '')

def getAppName(provider):
    return provider[0].capitalize() + provider[1:] + "VPN"

def initVendorConfig():
    with open(os.path.join(VENDOR_PATH, "vendor.conf"), "w") as f:
        f.write(getConf())

    caDir = os.path.join(VENDOR_PATH, PROVIDER)
    os.makedirs(caDir, exist_ok=True)
    with open(os.path.join(caDir, CA_README), "w") as f:
        f.write(getCAInfo())

    with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "ASSETS_REQUIRED")) as f:
        allAssets = f.read()
    with open(os.path.join(VENDOR_PATH, ASSETS_README), "w") as f:
        f.write(ASSETS_INFO)
        f.write(allAssets)

    with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../templates/vendor/vendor.qrc")) as f:
        qrc = f.read()
    with open(os.path.join(VENDOR_PATH, VENDOR_QRC), "w") as f:
        f.write(qrc)

def initGitRepo():
    out = subprocess.run(['git', 'init'], cwd=VENDOR_PATH)
    if out.returncode != 0:
        print(f'ERROR: cannot initialize git repo in {VENDOR_PATH}')


CONF_TEMPLATE = """[default]

provider = {provider}

[{provider}]

name                = {provider}
applicationName     = {appName} 
binaryName          = {provider}-vpn

providerURL         = https://{providerURL}
auth                = anon
apiURL              = https://api.{providerURL}/
caURL               = https://{providerURL}/ca.crt

infoURL             = https://{providerURL}/vpn
tosURL              = https://{providerURL}/tos
helpURL             = https://{providerURL}/support

geolocationAPI      = https://{providerURL}:9001/json

askForDonations     = false
donateURL           = https://{providerURL}/vpn/donate
"""

def getConf():
    return CONF_TEMPLATE.format(
    provider=PROVIDER,
    appName=getAppName(PROVIDER),
    providerURL=PROVIDER_URL)


CA_INFO = """Place in this folder your provider's CA certificate, with the name:

    {provider}-ca.crt
"""

def getCAInfo():
    return CA_INFO.format(provider=PROVIDER)

ASSETS_INFO = """This is the list of assets that you MUST place in this folder for your provider:

"""

if __name__ == "__main__":
    if len(sys.argv) != 1:
        bail()

    VENDOR_PATH = getVendorPath()
    PROVIDER = getProvider()
    PROVIDER_URL = getProviderURL()
    initVendor()
