from werkzeug.middleware.proxy_fix import ProxyFix
import os
import logging


class Config:
    ''' ### Flask ### '''
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string'

    ''' ### Flask-Mail ### '''
    MAIL_SERVER = os.environ.get('MAIL_SERVER')
    MAIL_PORT = int(os.environ.get('MAIL_PORT'))
    MAIL_USE_TLS = os.environ.get('MAIL_USE_TLS').lower() == 'true'
    MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
    MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')

    ''' ### Flask-SQLAlchemy ### '''
    SQLALCHEMY_DATABASE_URI = 'postgresql://{}:{}@db/{}'.format(
        os.environ.get('POSTGRES_USER'),
        os.environ.get('POSTGRES_PASSWORD'),
        os.environ.get('POSTGRES_DB_NAME'))
    SQLALCHEMY_RECORD_QUERIES = True
    SQLALCHEMY_TRACK_MODIFICATIONS = False

    ''' ### nopaque ### '''
    NOPAQUE_ADMIN = os.environ.get('NOPAQUE_ADMIN')
    NOPAQUE_CONTACT = os.environ.get('NOPAQUE_CONTACT')
    NOPAQUE_MAIL_SENDER = os.environ.get('NOPAQUE_MAIL_SENDER')
    NOPAQUE_MAIL_SUBJECT_PREFIX = '[nopaque]'
    NOPAQUE_PROTOCOL = os.environ.get('NOPAQUE_PROTOCOL')
    NOPAQUE_STORAGE = os.environ.get('NOPAQUE_STORAGE')

    os.makedirs('logs', exist_ok=True)
    logging.basicConfig(filename='logs/nopaque.log',
                        format='[%(asctime)s] %(levelname)s in '
                               '%(pathname)s:%(lineno)d - %(message)s',
                        datefmt='%Y-%m-%d %H:%M:%S', filemode='w')

    ''' ### Security enhancements ### '''
    if NOPAQUE_PROTOCOL == 'https':
        ''' ### Flask ### '''
        SESSION_COOKIE_SECURE = True

        ''' ### Flask-Login ### '''
        REMEMBER_COOKIE_HTTPONLY = True
        REMEMBER_COOKIE_SECURE = True

    @staticmethod
    def init_app(app):
        proxy_fix_kwargs = {'x_for': 1, 'x_host': 1, 'x_port': 1, 'x_proto': 1}
        app.wsgi_app = ProxyFix(app.wsgi_app, **proxy_fix_kwargs)


class DevelopmentConfig(Config):
    ''' ### Flask ### '''
    DEBUG = True

    ''' ### nopaque ### '''
    NOPAQUE_LOG_LEVEL = os.environ.get('NOPAQUE_LOG_LEVEL') or 'DEBUG'
    logging.basicConfig(level=NOPAQUE_LOG_LEVEL)


class TestingConfig(Config):
    ''' ### Flask ### '''
    TESTING = True

    ''' ### Flask-SQLAlchemy ### '''
    SQLALCHEMY_DATABASE_URI = 'sqlite://'

    ''' ### Flask-WTF ### '''
    WTF_CSRF_ENABLED = False


class ProductionConfig(Config):
    ''' ### nopaque ### '''
    NOPAQUE_LOG_LEVEL = os.environ.get('NOPAQUE_LOG_LEVEL') or 'ERROR'
    logging.basicConfig(level=NOPAQUE_LOG_LEVEL)


config = {
    'development': DevelopmentConfig,
    'testing': TestingConfig,
    'production': ProductionConfig,
    'default': DevelopmentConfig,
}