import os
import argparse

# Creates a tcp protocol

protocol = ""
plugin_type = ""
plugin_var = ""


def generate_protocol():
    read_input()
    process_file()


def read_input():
    """Requests input form the command line for empty variables if needed.
    """
    global protocol, plugin_type, plugin_var

    if protocol == "":
        protocol = input("Protocol Name [exampletcp]: ") or "exampletcp"

    protocol = protocol.lower()

    plugin_type = protocol + "Plugin"
    plugin_var = protocol[0] + "p"


def process_file():

    # Load path information
    generator_path = os.path.dirname(os.path.realpath(__file__))
    go_path = os.environ['GOPATH']

    for root, dirs, files in os.walk(generator_path + '/tcp-protocol/{protocol}'):

        for file in files:

            full_path = root + "/" + file

            # load file
            content = ""
            with open(full_path) as f:
                content = f.read()

            # process content
            content = replace_variables(content)

            # Write new path
            new_path = replace_variables(full_path).replace(".go.tmpl", ".go")

            # remove generator info from path
            file_path = new_path.replace(generator_path + "/tcp-protocol/", "")

            # New file path to write file content to
            write_file = "protos/" + file_path

            # Create parent directory if it does not exist yet
            dir = os.path.dirname(write_file)
            if not os.path.exists(dir):
                os.makedirs(dir)

            # Write file to new location
            with open(write_file, 'w') as f:
                f.write(content)


def replace_variables(content):
    """Replace all template variables with the actual values
    """
    return content.replace("{protocol}", protocol) \
        .replace("{plugin_var}", plugin_var) \
        .replace("{plugin_type}", plugin_type)


if __name__ == "__main__":

    parser = argparse.ArgumentParser(description="Creates a beat")
    parser.add_argument("--protocol", help="Protocol name")

    args = parser.parse_args()

    if args.protocol is not None:
        protocol = args.protocol

    generate_protocol()
