import logging
import os
from dotenv import load_dotenv


class EnvironmentConfig:
    """ Base class for configuration. """

    """ Most settings can be defined through environment variables. """

    # Load configuration from file
    load_dotenv(
        os.path.normpath(
            os.path.join(os.path.dirname(__file__), "..", "tasking-manager.env")
        )
    )

    # The base url the application is reachable
    APP_BASE_URL = os.getenv("TM_APP_BASE_URL", "http://127.0.0.1:5000/")
    if APP_BASE_URL.endswith("/"):
        APP_BASE_URL = APP_BASE_URL[:-1]

    API_VERSION = os.getenv("TM_APP_API_VERSION", "v2")
    ORG_CODE = os.getenv("TM_ORG_CODE", "")
    ORG_NAME = os.getenv("TM_ORG_NAME", "")
    ORG_LOGO = os.getenv(
        "TM_ORG_LOGO",
        "https://cdn.hotosm.org/tasking-manager/uploads/1588741335578_hot-logo.png",
    )
    ENVIRONMENT = os.getenv("TM_ENVIRONMENT", "")
    # The default tag used in the OSM changeset comment
    DEFAULT_CHANGESET_COMMENT = os.getenv("TM_DEFAULT_CHANGESET_COMMENT", None)

    # The address to use as the sender on auto generated emails
    EMAIL_FROM_ADDRESS = os.getenv("TM_EMAIL_FROM_ADDRESS", None)

    # The address to use as the receiver in contact form.
    EMAIL_CONTACT_ADDRESS = os.getenv("TM_EMAIL_CONTACT_ADDRESS", None)

    # A freely definable secret key for connecting the front end with the back end
    SECRET_KEY = os.getenv("TM_SECRET", None)

    # OSM API, Nomimatim URLs
    OSM_SERVER_URL = os.getenv("OSM_SERVER_URL", "https://www.openstreetmap.org")
    OSM_NOMINATIM_SERVER_URL = os.getenv(
        "OSM_NOMINATIM_SERVER_URL", "https://nominatim.openstreetmap.org"
    )

    # Database connection
    POSTGRES_USER = os.getenv("POSTGRES_USER", None)
    POSTGRES_PASSWORD = os.getenv("POSTGRES_PASSWORD", None)
    POSTGRES_ENDPOINT = os.getenv("POSTGRES_ENDPOINT", "postgresql")
    POSTGRES_DB = os.getenv("POSTGRES_DB", None)
    POSTGRES_PORT = os.getenv("POSTGRES_PORT", "5432")

    # Assamble the database uri
    if os.getenv("TM_DB", False):
        SQLALCHEMY_DATABASE_URI = os.getenv("TM_DB", None)
    elif os.getenv("TM_DB_CONNECT_PARAM_JSON", False):
        """
        This section reads JSON formatted Database connection parameters passed
        from AWS Secrets Manager with the ENVVAR key `TM_DB_CONNECT_PARAM_JSON`
        and forms a valid SQLALCHEMY DATABASE URI
        """
        import json

        _params = json.loads(os.getenv("TM_DB_CONNECT_PARAM_JSON", None))
        SQLALCHEMY_DATABASE_URI = (
            f"postgresql://{_params.get('username')}"
            + f":{_params.get('password')}"
            + f"@{_params.get('host')}"
            + f":{_params.get('port')}"
            + f"/{_params.get('dbname')}"
        )
    else:
        SQLALCHEMY_DATABASE_URI = (
            f"postgresql://{POSTGRES_USER}"
            + f":{POSTGRES_PASSWORD}"
            + f"@{POSTGRES_ENDPOINT}:"
            + f"{POSTGRES_PORT}"
            + f"/{POSTGRES_DB}"
        )

    # Logging settings
    LOG_LEVEL = os.getenv("TM_LOG_LEVEL", logging.DEBUG)
    LOG_DIR = os.getenv("TM_LOG_DIR", "logs")

    # Mapper Level values represent number of OSM changesets
    MAPPER_LEVEL_INTERMEDIATE = int(os.getenv("TM_MAPPER_LEVEL_INTERMEDIATE", 250))
    MAPPER_LEVEL_ADVANCED = int(os.getenv("TM_MAPPER_LEVEL_ADVANCED", 500))

    # Time to wait until task auto-unlock (e.g. '2h' or '7d' or '30m' or '1h30m')
    TASK_AUTOUNLOCK_AFTER = os.getenv("TM_TASK_AUTOUNLOCK_AFTER", "2h")

    # Configuration for sending emails
    SMTP_SETTINGS = {
        "host": os.getenv("TM_SMTP_HOST", None),
        "smtp_user": os.getenv("TM_SMTP_USER", None),
        "smtp_port": os.getenv("TM_SMTP_PORT", 25),
        "smtp_password": os.getenv("TM_SMTP_PASSWORD", None),
    }

    # Languages offered by the Tasking Manager
    # Please note that there must be exactly the same number of Codes as languages.
    SUPPORTED_LANGUAGES = {
        "codes": os.getenv(
            "TM_SUPPORTED_LANGUAGES_CODES",
            "ar, cs, de, el, en, es, fa_IR, fr, he, hu, id, it, ja, ko, mg, ml, nl_NL, pt, pt_BR, ru, sv, sw, tl, tr, uk, zh_TW",  # noqa
        ),
        "languages": os.getenv(
            "TM_SUPPORTED_LANGUAGES",
            "عربى, Čeština, Deutsch, Ελληνικά, English, Español, فارسی, Français, עברית, Magyar, Indonesia, Italiano, 日本語, 한국어, Malagasy, Malayalam, Nederlands, Português, Português (Brasil), Русский язык, Svenska, Kiswahili, Filipino (Tagalog), Türkçe, Українська, 繁體中文",  # noqa
        ),
    }

    # Connection to OSM authentification system
    OSM_OAUTH_SETTINGS = {
        "base_url": "{}/api/0.6/".format(OSM_SERVER_URL),
        "consumer_key": os.getenv("TM_CONSUMER_KEY", None),
        "consumer_secret": os.getenv("TM_CONSUMER_SECRET", None),
        "request_token_url": "{}/oauth/request_token".format(OSM_SERVER_URL),
        "access_token_url": "{}/oauth/access_token".format(OSM_SERVER_URL),
        "authorize_url": "{}/oauth/authorize".format(OSM_SERVER_URL),
    }

    # Some more definitions (not overridable)
    SEND_FILE_MAX_AGE_DEFAULT = 0
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_POOL_SIZE = 10
    SQLALCHEMY_MAX_OVERFLOW = 10

    # Image upload Api
    IMAGE_UPLOAD_API_KEY = os.getenv("TM_IMAGE_UPLOAD_API_KEY", None)
    IMAGE_UPLOAD_API_URL = os.getenv("TM_IMAGE_UPLOAD_API_URL", None)

    # Sentry backend DSN
    SENTRY_BACKEND_DSN = os.getenv("TM_SENTRY_BACKEND_DSN", None)


class TestEnvironmentConfig(EnvironmentConfig):
    POSTGRES_USER = os.getenv("POSTGRES_USER", None)
    POSTGRES_PASSWORD = os.getenv("POSTGRES_PASSWORD", None)
    POSTGRES_ENDPOINT = os.getenv("POSTGRES_ENDPOINT", "localhost")
    POSTGRES_DB = os.getenv("POSTGRES_DB", None)
    POSTGRES_PORT = os.getenv("POSTGRES_PORT", "5432")
    SQLALCHEMY_DATABASE_URI = (
        f"postgresql://{POSTGRES_USER}"
        + f":{POSTGRES_PASSWORD}"
        + f"@{POSTGRES_ENDPOINT}:"
        + f"{POSTGRES_PORT}"
        + f"/test_{POSTGRES_DB}"
    )
