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')
    MAIL_DEFAULT_SENDER = os.environ.get('MAIL_DEFAULT_SENDER')

    ''' ### Flask-SQLAlchemy ### '''
    SQLALCHEMY_ENGINE_OPTIONS = {'pool_size': 30, 'pool_timeout': 30}
    SQLALCHEMY_TRACK_MODIFICATIONS = False

    ''' ### Opaque ### '''
    NOPAQUE_ADMIN = os.environ.get('NOPAQUE_ADMIN')
    NOPAQUE_STORAGE = '/mnt/nopaque'

    @staticmethod
    def init_app(app):
        pass


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

    ''' ### Flask-SQLAlchemy ### '''
    SQLALCHEMY_DATABASE_URI = 'postgresql://{}:{}@db/{}'.format(
        os.environ.get('POSTGRES_USER'),
        os.environ.get('POSTGRES_PASSWORD'),
        os.environ.get('POSTGRES_DB_NAME')
    )
    if not os.path.isfile('logs/nopaque.log'):
        file_path = os.path.join(os.getcwd(), 'logs/nopaque.log')
        log = open(file_path, 'w+')
        log.close()
    if os.environ.get('FLASK_CONFIG') == 'development':
        log_format = ("%(asctime)s - %(levelname)s - %(name)s - "
                      "%(filename)s - %(lineno)d - %(message)s")
        logging.basicConfig(filename='logs/nopaque.log', level='WARNING',
                            format=log_format, datefmt='%Y-%m-%d %H:%M:%S',
                            filemode='w')
        logger = logging.getLogger(__name__)
        logger.warning('Logging has started with level WARNING.'
                       ' From development config.')


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

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

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


class ProductionConfig(Config):
    ''' ### Flask-SQLAlchemy ### '''
    SQLALCHEMY_DATABASE_URI = 'postgresql://{}:{}@db/{}'.format(
        os.environ.get('POSTGRES_USER'),
        os.environ.get('POSTGRES_PASSWORD'),
        os.environ.get('POSTGRES_DB_NAME')
    )
    if not os.path.isfile('logs/nopaque.log'):
        file_path = os.path.join(os.getcwd(), 'logs/nopaque.log')
        log = open(file_path, 'w+')
        log.close()
    if os.environ.get('FLASK_CONFIG') == 'production':
        log_format = ("%(asctime)s - %(levelname)s - %(name)s - "
                      "%(filename)s - %(lineno)d - %(message)s")
        logging.basicConfig(filename='logs/nopaque.log', level='ERROR',
                            format=log_format, datefmt='%Y-%m-%d %H:%M:%S',
                            filemode='w')
        logger = logging.getLogger(__name__)
        logger.error('Logging has started with level ERROR.'
                     ' From production config.')


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