import logging
import os
import socket
import sys
from distutils.util import strtobool
from pathlib import Path
from subprocess import CalledProcessError, check_output

default_root = Path(__file__).resolve().parent.parent

# Logging config
FILE_LOGGING = bool(strtobool(os.getenv("FILE_LOGGING", "true")))
LOG_FILE = os.getenv("LOG_FILE", "/var/log/hc_managed_servers/app.log")

ALERTS_DIR = f'{os.getenv("PROJECT_ROOT", default_root)}/scripts'
CHECK_LOCKS_DIR = f'{os.getenv("PROJECT_ROOT", default_root)}/var/check_locks'
API_SCHEMA_PATH = f'{os.getenv("PROJECT_ROOT", default_root)}/app/api/schema.json'
SCRIPTS_SCHEMA_PATH = f"{ALERTS_DIR}/schema.json"

MAIN_SCRIPT = "service_alerts.sh"
BASH_UTILS = f'{os.getenv("PROJECT_ROOT", default_root)}/utils.sh'
TEMP_ACKNOWLEDGE_DURATION = 24 * 3600

logger = logging.getLogger("managed_servers")
logger.setLevel(logging.INFO)
log_format = f"%(asctime)s {socket.gethostname()} [alert_fixer - %(levelname)s]: %(message)s"

console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(logging.INFO)
console_handler.setFormatter(logging.Formatter(log_format))


def setup_file_logging():
    file_handler = logging.FileHandler(LOG_FILE)
    file_handler.setLevel(logging.INFO)
    file_handler.setFormatter(logging.Formatter(log_format))
    logger.addHandler(file_handler)

    logger.addHandler(console_handler)


def load_settings():
    cmd = f'source {BASH_UTILS} && env | grep -E "CRON_INTERVAL_MIN|LOG_FILE|API_"'
    try:
        output = check_output(cmd, shell=True, executable="/bin/bash")
        env_vars = output.decode().splitlines()
        for var in env_vars:
            key, value = var.split("=", 1)
            os.environ[key] = value
    except CalledProcessError as e:
        logger.error(f"Error {e.returncode} when loading settings: {e.output}")
