#!/usr/bin/env python

# Script by gfyoung
# https://github.com/gfyoung
#
# This Python script will generate hosts files and update the readme file.

from __future__ import print_function

import argparse
import subprocess
import sys


def print_failure(msg):
    """
    Print a failure message.

    Parameters
    ----------
    msg : str
        The failure message to print.
    """

    print("\033[91m" + msg + "\033[0m")


def update_hosts_file(*flags):
    """
    Wrapper around running updateHostsFile.py

    Parameters
    ----------
    flags : varargs
        Commandline flags to pass into updateHostsFile.py. For more info, run
        the following command in the terminal or command prompt:

        ```
        python updateHostsFile.py -h
        ```
    """

    if subprocess.call([sys.executable, "updateHostsFile.py"] + list(flags)):
        print_failure("Failed to update hosts file")


def update_readme_file():
    """
    Wrapper around running updateReadme.py
    """

    if subprocess.call([sys.executable, "updateReadme.py"]):
        print_failure("Failed to update readme file")


def recursively_loop_extensions(extension, extensions, current_extensions):
    """
    Helper function that recursively calls itself to prevent manually creating
    all possible combinations of extensions.

    Will call update_hosts_file for all combinations of extensions
    """

    c_extensions = extensions.copy()
    c_current_extensions = current_extensions.copy()
    c_current_extensions.append(extension)

    name = "-".join(c_current_extensions)

    params = ("-a", "-n", "-o", "alternates/"+name, "-e") + tuple(c_current_extensions)
    update_hosts_file(*params)

    params = ("-a", "-n", "-s", "--nounifiedhosts", "-o", "alternates/"+name+"-only", "-e") + tuple(c_current_extensions)
    update_hosts_file(*params)

    while len(c_extensions) > 0:
        recursively_loop_extensions(c_extensions.pop(0), c_extensions, c_current_extensions)


def main():
    parser = argparse.ArgumentParser(
        description="Creates custom hosts "
        "file from hosts stored in "
        "data subfolders."
    )
    parser.parse_args()

    # Update the unified hosts file
    update_hosts_file("-a")

    # List of extensions we want to generate, we will loop over them recursively to prevent manual definitions
    # Only add new extensions to the end of the array, to avoid relocating existing hosts-files
    extensions = ["fakenews", "gambling", "porn", "social"]

    while len(extensions) > 0:
        recursively_loop_extensions(extensions.pop(0), extensions, [])

    # Update the readme files.
    update_readme_file()


if __name__ == "__main__":
    main()
