import os
import logging
from dotenv import load_dotenv

BASEDIR = os.path.abspath(os.path.dirname(__file__))
load_dotenv(os.path.join(BASEDIR, ".env"))


BOOL_STR = {
    0: False,
    1: True,
    "": False,
    "0": False,
    "1": True,
    "f": False,
    "false": False,
    "o": True,
    "on": True,
    "n": False,
    "t": True,
    "true": True,
    True: True,
    "v": True,
    "vrai": True,
    "y": True,
}

def to_bool(x) -> bool:
    """Cast value to boolean.
    The value may be encoded as a string
    False are: empty, "0", "False", "f", "n".
    True: all other values, such as "1", "True", "foo", "bar"...
    Case insentive, ignore leading and trailing spaces.
    """
    if isinstance(x, str):
        return BOOL_STR.get(x.lower().strip(), True)
    return bool(x)

class Config:
    """General configuration. Mostly loaded from environment via .env"""

    FLASK_ENV = None  # # set in subclass
    SECRET_KEY = os.environ.get("SECRET_KEY") or "90e01e751977d4276a4c70d98564b425e"
    # LOG_TO_STDOUT = os.environ.get("LOG_TO_STDOUT")
    LOG_LEVEL = getattr(logging, os.environ.get("LOG_LEVEL", "INFO"), "INFO")
    MAIL_SERVER = os.environ.get("MAIL_SERVER", "localhost")
    LANGUAGES = ["fr", "en"]  # unused for now
    ADMIN_MAIL = os.environ.get("ADMIN_MAIL")
    ADMIN_LOGIN = os.environ.get("ADMIN_LOGIN") or "admin"
    ADMINS = [ADMIN_MAIL]
    ERR_MAIL = os.environ.get("ERR_MAIL")
    # Le "from" des mails émis. Attention: peut être remplacée par la préférence email_from_addr:
    MAIL_FROM = os.environ.get("MAIL_FROM") or ("no-reply@" + MAIL_SERVER)

    AUTOSCO_DIR = os.environ.get("AUTOSCO_DIR", "/opt/autosco")
    AUTOSCO_VAR_DIR = os.environ.get("AUTOSCO_VAR_DIR", "/opt/autosco-data")
    AUTOSCO_LOG_FILE = os.path.join(AUTOSCO_VAR_DIR, "log", "autosco.log")
    # evite confusion avec le log nginx scodoc_error.log:
    AUTOSCO_ERR_FILE = os.path.join(AUTOSCO_VAR_DIR, "log", "autosco_exc.log")
    #
    MAX_CONTENT_LENGTH = 16 * 1024 * 1024  # Flask uploads (16Mo, en ligne avec nginx)
    # flask_json:
    JSON_ADD_STATUS = False
    JSON_USE_ENCODE_METHODS = True
    JSON_DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%S%z"  # "%Y-%m-%dT%H:%M:%S"
    # --- Lien avec API ScoDoc
    SCODOC_URL = os.environ.get("SCODOC_URL", "http://localhost:5000")
    SCODOC_LOGIN = os.environ.get("SCODOC_LOGIN", "autosco")
    SCODOC_PASSWORD = os.environ.get("SCODOC_PASSWORD")
    SCODOC_CHECK_CERTIFICATE = to_bool(os.environ.get("SCODOC_CHECK_CERTIFICATE", True))
    API_TIMEOUT = 120  # 2 minutes
    API_URL = SCODOC_URL + "/ScoDoc/api"
    SCODOC_DEPT_ACRONYM = os.environ.get("SCODOC_DEPT_ACRONYM", "ESPL")

    def __getitem__(self, k) -> str | int | None:
        return getattr(self, k)

    def get(self, k, default=None):
        return getattr(self, k, default=default)


class ProdConfig(Config):
    "mode production, normalement derrière nginx/gunicorn"

    FLASK_ENV = "production"
    DEBUG = False
    TESTING = False
    PREFERRED_URL_SCHEME = "https"


class DevConfig(Config):
    "mode développement"

    FLASK_ENV = "development"
    DEBUG = True
    TESTING = False
    SECRET_KEY = os.environ.get("DEV_SECRET_KEY") or "cc4fbec7d9a34eb69a7e3e710087d87a"


class TestConfig(DevConfig):
    "Pour les tests unitaires"

    TESTING = True
    DEBUG = False
    SERVER_NAME = os.environ.get("AUTOSCO_TEST_SERVER_NAME") or "autotest.gr"
    SECRET_KEY = os.environ.get("TEST_SECRET_KEY") or "c8ecff5db1592c308f563ff30e0f6bbc"


class TestAPIConfig(Config):
    "Pour les tests de l'API"

    FLASK_ENV = "test_api"
    TESTING = False
    DEBUG = True
    SECRET_KEY = os.environ.get("TEST_SECRET_KEY") or "d8ecff5db15946789Hhahbh88aja276"


mode = os.environ.get("FLASK_ENV", "production")
if mode == "production":
    RunningConfig = ProdConfig
elif mode == "development":
    RunningConfig = DevConfig
elif mode == "test":
    RunningConfig = TestConfig
elif mode == "test_api":
    RunningConfig = TestAPIConfig