#!/usr/bin/env python3

import argparse
import logging
import yaml
import os
import re

from types import SimpleNamespace
from pathlib import Path

from stignore_agent.helpers import parse_config
from stignore_agent.app import app


SEARCH_DEPTH = re.compile(r"!(?P<depth>[0-9]+)!(?P<folder>.+)")


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "-v", "--verbose", action="count", default=0, help="Logging level"
    )
    parser.add_argument("--host", default="127.0.0.1", help="Host address to listen on")
    parser.add_argument("--port", default="8080", help="Port to listen on")
    parser.add_argument("--config-file", help="Configuration file to load")

    args = parser.parse_args()

    if args.verbose >= 2:
        log_level = logging.DEBUG
    elif args.verbose >= 1:
        log_level = logging.INFO
    else:
        log_level = logging.WARNING

    logging.basicConfig(level=log_level)
    logger = logging.getLogger("stignore-agent")

    # Attempt to load config file first
    if args.config_file is not None and os.path.exists(args.config_file):
        with open(args.config_file, "rt", encoding="utf-8") as config_file:
            config = yaml.safe_load(config_file)
    else:
        config = {}

    # Overwrite with env vars
    if base_folder := os.getenv("STIGNORE_BASE_FOLDER", None):
        config["base_folder"] = base_folder

    if folders := os.getenv("STIGNORE_FOLDERS", None):
        config["folders"] = []

        for folder in folders.split(","):
            if result := SEARCH_DEPTH.match(folder):
                groups = result.groupdict()
                config["folders"].append(
                    {"name": groups["folder"], "depth": int(groups["depth"])}
                )
            else:
                config["folders"].append({"name": folder})

    if not config.get("base_folder") or not config.get("folders"):
        parser.error("--config-file not set or ENV vars not provided")

    app.config.update(parse_config(config))
    app.config["logger"] = logger

    app.config["SECRET_KEY"] = os.urandom(16)

    app.run(host=args.host, port=args.port)
