text: # SPDX-License-Identifier: ISC
  # Copyright (c) Justus Winter <4winter@informatik.uni-hamburg.de>
  
  import glob
  import sys
  import logging
  import argparse
  
  from afew.Database import Database
  from afew.main import main as inner_main
  from afew.FilterRegistry import all_filters
  from afew.Settings import user_config_dir, get_filter_chain, \
      get_mail_move_rules, get_mail_move_age, get_mail_move_rename
  from afew.NotmuchSettings import read_notmuch_settings, get_notmuch_new_query
  from afew.version import version
  
  parser = argparse.ArgumentParser()
  parser.add_argument('-V', '--version', action='version', version=version)
  
  # the actions
  action_group = parser.add_argument_group(
      'Actions',
      'Please specify exactly one action.'
  )
  action_group.add_argument(
      '-t', '--tag', action='store_true',
      help='run the tag filters'
  )
  action_group.add_argument(
      '-w', '--watch', action='store_true',
      help='continuously monitor the mailbox for new files'
  )
  action_group.add_argument(
      '-m', '--move-mails', action='store_true',
      help='move mail files between maildir folders'
  )
  
  # query modifiers
  query_modifier_group = parser.add_argument_group(
      'Query modifiers',
      'Please specify either --all or --new or a query string.'
  )
  query_modifier_group.add_argument(
      '-a', '--all', action='store_true',
      help='operate on all messages'
  )
  query_modifier_group.add_argument(
      '-n', '--new', action='store_true',
      help='operate on all new messages'
  )
  query_modifier_group.add_argument(
      'query', nargs='*', help='a notmuch query to find messages to work on'
  )
  
  # general options
  options_group = parser.add_argument_group('General options')
  # TODO: get config via notmuch api
  options_group.add_argument(
      '-C', '--notmuch-config', default=None,
      help='path to the notmuch configuration file [default: $NOTMUCH_CONFIG or'
           ' ~/.notmuch-config]'
  )
  options_group.add_argument(
      '-e', '--enable-filters',
      help="filter classes to use, separated by ',' [default: filters specified"
           " in afew's config]"
  )
  options_group.add_argument(
      '-d', '--dry-run', default=False, action='store_true',
      help="don't change the db [default: %(default)s]"
  )
  options_group.add_argument(
      '-R', '--reference-set-size', type=int, default=1000,
      help='size of the reference set [default: %(default)s]'
  )
  
  options_group.add_argument(
      '-T', '--reference-set-timeframe', type=int, default=30, metavar='DAYS',
      help='do not use mails older than DAYS days [default: %(default)s]'
  )
  
  options_group.add_argument(
      '-v', '--verbose', dest='verbosity', action='count', default=0,
      help='be more verbose, can be given multiple times'
  )
  
  options_group.add_argument(
      '-N', '--notmuch-args', default='',
      help='arguments for notmuch new (in move mode)'
  )
  
  
  def main():
      if sys.version_info < (3, 6):
          sys.exit("Python 3.6 or later is required.")
  
      args = parser.parse_args()
  
      no_actions = len(filter(None, (
          args.tag,
          args.watch,
          args.move_mails
      )))
      if no_actions == 0:
          sys.exit('You need to specify an action')
      elif no_actions > 1:
          sys.exit('Please specify exactly one action')
  
      no_query_modifiers = len(filter(None, (args.all,
                                             args.new, args.query)))
      if no_query_modifiers == 0 and not args.watch \
              and not args.move_mails:
          sys.exit('You need to specify one of --new, --all or a query string')
      elif no_query_modifiers > 1:
          sys.exit('Please specify either --all, --new or a query string')
  
      read_notmuch_settings(args.notmuch_config)
  
      if args.new:
          query_string = get_notmuch_new_query()
      elif args.all:
          query_string = ''
      else:
          query_string = ' '.join(args.query)
  
      loglevel = {
          0: logging.WARNING,
          1: logging.INFO,
          2: logging.DEBUG,
      }[min(2, args.verbosity)]
      logging.basicConfig(level=loglevel)
  
      sys.path.insert(0, user_config_dir)
      for file_name in glob.glob1(user_config_dir, '*.py'):
          logging.info('Importing user filter %r' % (file_name,))
          __import__(file_name[:-3], level=0)
  
      if args.move_mails:
          args.mail_move_rules = get_mail_move_rules()
          args.mail_move_age = get_mail_move_age()
          args.mail_move_rename = get_mail_move_rename()
  
      with Database() as database:
          configured_filter_chain = get_filter_chain(database)
          if args.enable_filters:
              args.enable_filters = args.enable_filters.split(',')
  
              all_filters_set = set(all_filters.keys())
              enabled_filters_set = set(args.enable_filters)
              if not all_filters_set.issuperset(enabled_filters_set):
                  sys.exit('Unknown filter(s) selected: %s' % (' '.join(
                      enabled_filters_set.difference(all_filters_set))))
  
              args.enable_filters = [all_filters[filter_name](database)
                                     for filter_name
                                     in args.enable_filters]
          else:
              args.enable_filters = configured_filter_chain
  
          inner_main(args, database, query_string)
  