"""
OnlyLegs - Setup
Runs when the app detects that there is no user directory
"""
import os
import logging
import re
import platformdirs
import yaml


USER_DIR = platformdirs.user_config_dir("onlylegs")


class Configuration:
    """
    Setup the application on first run
    """

    def __init__(self):
        """
        Main setup function
        """
        print("Running startup checks...")

        # Check if the user directory exists
        if not os.path.exists(USER_DIR):
            self.make_dir()

        # Check if the .env file exists
        if not os.path.exists(os.path.join(USER_DIR, ".env")):
            self.make_env()

        # Check if the conf.yml file exists
        if not os.path.exists(os.path.join(USER_DIR, "conf.yml")):
            self.make_yaml()

        # Load the config files
        self.logging_config()

    @staticmethod
    def make_dir():
        """
        Create the user directory
        """
        os.makedirs(USER_DIR)
        os.makedirs(os.path.join(USER_DIR, "instance"))
        os.makedirs(os.path.join(USER_DIR, "media"))
        os.makedirs(os.path.join(USER_DIR, "media", "uploads"))
        os.makedirs(os.path.join(USER_DIR, "media", "cache"))
        os.makedirs(os.path.join(USER_DIR, "media", "pfp"))

        print("Created user directory at:", USER_DIR)

    @staticmethod
    def make_env():
        """
        Create the .env file with default values
        """
        env_conf = {
            "FLASK_SECRET": os.urandom(32).hex(),
        }

        with open(os.path.join(USER_DIR, ".env"), encoding="utf-8", mode="w+") as file:
            for key, value in env_conf.items():
                file.write(f"{key}={value}\n")

        print(
            """
####################################################
# A NEW KEY WAS GENERATED FOR YOU! PLEASE NOTE     #
# DOWN THE FLASK_SECRET KEY LOCATED IN YOUR        #
# .config/onlylegs/.env FOLDER! LOOSING THIS KEY   #
# WILL RESULT IN YOU BEING UNABLE TO LOG IN!       #
####################################################
              """
        )

    @staticmethod
    def make_yaml():
        """
        Create the YAML config file with default values
        """
        is_correct = False
        email_regex = re.compile(r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b")
        username_regex = re.compile(r"\b[A-Za-z0-9._%+-]+\b")

        print("\nNo config file found, please enter the following information:")
        while not is_correct:
            username = input("Admin username: ")
            name = input("Admin name: ")
            email = input("Admin email: ")

            # Check if the values are valid
            if not username or not username_regex.match(username):
                print("Username is invalid!")
                continue

            if not name:
                print("Name is invalid!")
                continue

            if not email or not email_regex.match(email):
                print("Email is invalid!")
                continue

            # Check if user is happy with the values
            if input("Is this correct? (y/n): ").lower() == "y":
                is_correct = True

        yaml_conf = {
            "admin": {
                "name": name,
                "username": username,
                "email": email,
            },
            "upload": {
                "allowed-extensions": {
                    "jpg": "jpeg",
                    "jpeg": "jpeg",
                    "png": "png",
                    "webp": "webp",
                },
                "max-size": 69,
                "max-load": 50,
                "rename": "GWA_{{username}}_{{time}}",
            },
            "website": {
                "name": "OnlyLegs",
                "motto": "A gallery built for fast and simple image management!",
                "language": "en",
            },
        }

        with open(
            os.path.join(USER_DIR, "conf.yml"), encoding="utf-8", mode="w+"
        ) as file:
            yaml.dump(yaml_conf, file, default_flow_style=False)

        print(
            "Generated config file, you can change these values in the settings of the app"
        )

    @staticmethod
    def logging_config():
        """
        Set the logging config
        """
        logging.getLogger("werkzeug").disabled = True
        logging.basicConfig(
            filename=os.path.join(USER_DIR, "only.log"),
            level=logging.INFO,
            datefmt="%Y-%m-%d %H:%M:%S",
            format="%(asctime)s %(levelname)s %(name)s %(threadName)s : %(message)s",
            encoding="utf-8",
        )