# authentic2 - versatile identity manager
# Copyright (C) 2010-2019 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.


try:
    import ldap  # pylint: disable=unused-import
    from ldap.filter import filter_format  # pylint: disable=unused-import
except ImportError:
    ldap = None

import logging
import os
from contextlib import contextmanager

from django.core.management.base import BaseCommand

from authentic2.backends.ldap_backend import LDAPBackend


@contextmanager
def log_ldap_to_console(verbosity):
    if 'TERM' not in os.environ:
        yield
    else:
        handler = logging.StreamHandler()
        # add timestamp to messages
        formatter = logging.Formatter(fmt='%(asctime)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
        handler.setFormatter(formatter)

        if verbosity == 1:
            handler.setLevel(logging.ERROR)
        elif verbosity == 2:
            handler.setLevel(logging.INFO)
        elif verbosity == 3:
            handler.setLevel(logging.DEBUG)

        logger = logging.getLogger('authentic2.backends.ldap_backend')
        initial_level = logger.level
        try:
            logger.propagate = False
            logger.setLevel(logging.DEBUG)
            logger.addHandler(handler)
            yield
        finally:
            logger.propagate = True
            logger.setLevel(initial_level)
            logger.removeHandler(handler)


class Command(BaseCommand):
    def add_arguments(self, parser):
        parser.add_argument('--realm', help='Limit sync to this realm')

    def handle(self, *args, **kwargs):
        verbosity = int(kwargs['verbosity'])

        with log_ldap_to_console(verbosity):
            for dummy in LDAPBackend.get_users(realm=kwargs['realm']):
                continue
