#!/usr/bin/python

"""List all mailing lists.

Usage: %(program)s [options]

Where:

    --domain=DOMAIN

    --owner=OWNER[S]

    --members

    --check-existent

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

"""

from __future__ import print_function;

import sys
import getopt
import paths
import re

from Mailman import mm_cfg
from Mailman import MailList
from Mailman import MemberAdaptor
from Mailman import Utils
from Mailman import Errors

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',
                                   ['domain=',
                                    'owner=',
                                    'members',
                                    'check-existent',
                                    'help'])
    except getopt.error, msg:
        usage(1, msg)

    domain = None
    owners = None
    members_list = False
    check_exist = False
    for opt, arg in opts:
        if opt in ('-h', '--help'):
            usage(0)
        elif opt in ('--domain'):
            domain = arg.lower()
        elif opt in ('--owner'):
            owners = arg.lower().split(',')
        elif opt in ('--members'):
            members_list = True
        elif opt in ('--check-existent'):
            check_exist = True

    names = [i.lower() for i in args] if args else Utils.list_names()
    names.sort()

    mlists = []
    for n in names:
        try:
            mlist = MailList.MailList(n, lock=0)
        except Errors.MMUnknownListError:
            if check_exist:
                continue
            else:
                raise
        if domain and mlist.host_name.lower() != domain:
            continue
        if owners:
            owner_found = False
            mlist_owners = [i.lower() for i in mlist.owner]
            for owner in owners:
                if owner in mlist_owners:
                    owner_found = True
                    break
            if not owner_found:
                continue

        ## Non-standard attribute
        try:
            created_by = mlist.created_by
        except AttributeError:
            created_by = ""

        ## Non-standard attribute
        try:
            created_date = mlist.created_date
        except AttributeError:
            created_date = ""

        post_size_limit = mlist.max_message_size / 1000

        posters = []
        if mlist.default_member_moderation:
            postfrom = 'posters'
            for member in mlist.getRegularMemberKeys():
                if not mlist.getMemberOption(member, mm_cfg.Moderate):
                    posters.append(mlist.getMemberCPAddress(member))
            posters.sort()
        else:
            if mlist.generic_nonmember_action:
                postfrom = 'members'
            else:
                postfrom = 'any'

        if mlist.reply_goes_to_list:
            replyto = {1:"list", 2:"set"}[mlist.reply_goes_to_list]
        else:
            replyto = "none"

        print(
            mlist.real_name,
            mlist.host_name,
            ## Filter tab, CR, LF
            re.sub("\s+", " ", mlist.description),
            re.sub("\s+", " ", mlist.info),
            ",".join(mlist.owner),
            ",".join(posters),
            post_size_limit,
            postfrom,
            replyto,
            created_by,
            created_date,
            sep="\t"
        )

        if members_list:
            members = mlist.getMemberCPAddresses(mlist.getRegularMemberKeys())
            members.sort()
            for member in members:
                if mlist.getDeliveryStatus(member) == MemberAdaptor.ENABLED:
                    print(member, mlist.getMemberName(member) or '', sep="\t")
            print



if __name__ == '__main__':
    main()

