#!/usr/bin/python

"""Configure a mailing list.

Usage: %(program)s [options] listname display desc owner postfrom replyto

Where:

    -h / --help
        Print this text and exit.

"""

from __future__ import print_function

import sys
import getopt
import paths

from Mailman import mm_cfg
from Mailman import MailList
from Mailman import MemberAdaptor
from Mailman import Errors
from Mailman.i18n import _


class UserDesc: pass


program = sys.argv[0]


def usage(code, msg=''):
    if code:
        fd = sys.stderr
    else:
        fd = sys.stdout
    print(_(__doc__), file=fd)
    if msg:
        print(msg, file=fd)
    sys.exit(code)


def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], 'h',
                                   ['help'])
    except getopt.error as e:
        usage(1, e)

    for opt, arg in opts:
        if opt in ('-h', '--help'):
            usage(0)

    mlname, display, description, owner_mail, poster_mail, postsizelimit, postfrom, replyto = args

    listname = mlname.lower()
    try:
        mlist = MailList.MailList(listname)
    except Errors.MMUnknownListError:
        usage(1, _('No such list: %(listname)s'))

    try:
        mlist.real_name = mlname
        if len(owner_mail) > 0:
            mlist.owner = owner_mail.split(',')
        mlist.description = display
        mlist.info = description
        mlist.max_message_size = int(postsizelimit) * 1000

        if len(postfrom) > 0:
            if postfrom == 'any':
                mlist.generic_nonmember_action = 0  # Accept
                mlist.member_moderation_action = 0  # Hold
                mlist.default_member_moderation = False
                posters = []
            elif postfrom == 'members':
                mlist.generic_nonmember_action = 2  # Reject
                mlist.member_moderation_action = 0  # Hold
                mlist.default_member_moderation = False
                posters = []
            elif postfrom == 'posters':
                mlist.generic_nonmember_action = 2  # Reject
                mlist.member_moderation_action = 1  # Reject
                mlist.default_member_moderation = True
                posters = poster_mail.split(',')

        if mlist.default_member_moderation:
            posters_lower = [v.lower() for v in posters]
            for member in mlist.getRegularMemberKeys():
                if member in posters_lower:
                    mlist.setMemberOption(member, mm_cfg.Moderate, False)
                    if mlist.getDeliveryStatus(member) != MemberAdaptor.ENABLED:
                        mlist.setDeliveryStatus(member, MemberAdaptor.UNKNOWN)
                else:
                    if mlist.getDeliveryStatus(member) == MemberAdaptor.UNKNOWN:
                        mlist.ApprovedDeleteMember(member, 'mm-config', False, False)
                    else:
                        mlist.setMemberOption(member, mm_cfg.Moderate, True)
            for poster in posters:
                if mlist.isMember(poster):
                    continue
                userdesc = UserDesc()
                userdesc.address = poster
                userdesc.fullname = ''
                mlist.ApprovedAddMember(userdesc,
                                        ack=False,
                                        admin_notif=False,
                                        whence='mm-config',
                                        )
                mlist.setMemberOption(poster, mm_cfg.Moderate, False)
                mlist.setDeliveryStatus(poster, MemberAdaptor.UNKNOWN)
        else:
            for member in mlist.getRegularMemberKeys():
                if mlist.getMemberOption(member, mm_cfg.Moderate):
                    mlist.setMemberOption(member, mm_cfg.Moderate, False)
                else:
                    if mlist.getDeliveryStatus(member) == MemberAdaptor.UNKNOWN:
                        mlist.ApprovedDeleteMember(member, 'mm-config', False, False)

        if len(replyto):
            mlist.reply_goes_to_list = \
                {'none': 0, 'list': 1, 'set': 2}[replyto]

        mlist.Save()
    finally:
        mlist.Unlock()


if __name__ == '__main__':
    main()
