import argparse
import datetime
import os

# Creates a new beat or metricbeat based on the given parameters

project_name = ""
github_name = ""
beat = ""
beat_path = ""
full_name = ""


def generate_beat(args):

    global project_name, github_name, beat, beat_path, full_name

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

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

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

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

    read_input()
    process_file(args.type)


def read_input():
    """Requests input form the command line for empty variables if needed.
    """
    global project_name, github_name, beat, beat_path, full_name

    if project_name == "":
        project_name = raw_input("Beat Name [Examplebeat]: ") or "examplebeat"

    if github_name == "":
        github_name = raw_input("Your Github Name [your-github-name]: ") or "your-github-name"
    beat = project_name.lower()

    if beat_path == "":
        beat_path = raw_input("Beat Path [github.com/" + github_name + "/" + beat +
                              "]: ") or "github.com/" + github_name + "/" + beat

    if full_name == "":
        full_name = raw_input("Firstname Lastname: ") or "Firstname Lastname"


def process_file(beat_type):

    # Load path information
    template_path = os.path.dirname(os.path.realpath(__file__)) + '/../generator'
    go_path = os.environ['GOPATH']

    for root, dirs, files in os.walk(template_path + '/' + beat_type + '/{beat}'):

        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 and beat name from path
            file_path = new_path.replace(template_path + "/" + beat_type + "/" + beat, "")

            # New file path to write file content to
            write_file = go_path + "/src/" + beat_path + "/" + 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("{project_name}", project_name) \
        .replace("{github_name}", github_name) \
        .replace("{beat}", beat) \
        .replace("{Beat}", beat.capitalize()) \
        .replace("{beat_path}", beat_path) \
        .replace("{full_name}", full_name) \
        .replace("{year}", str(datetime.datetime.now().year))


def get_parser():
    """Creates parser to parse script params
    """
    parser = argparse.ArgumentParser(description="Creates a beat")
    parser.add_argument("--project_name", help="Project name")
    parser.add_argument("--github_name", help="Github name")
    parser.add_argument("--beat_path", help="Beat path")
    parser.add_argument("--full_name", help="Full name")
    parser.add_argument("--type", help="Beat type", default="beat")

    return parser


if __name__ == "__main__":

    parser = get_parser()
    args = parser.parse_args()

    generate_beat(args)
