import sys
import dbhash
from mail.models import Server, Domain, Account, Address

def header():
    return """
################################################################################
# THIS FILE IS AUTOMATICALLY GENRATED!!!!     ##################################
# DO NOT MODIFY!                              ##################################
# MODIFY THE CORRESPONDING DATABASE INSTEAD!  ##################################
################################################################################"""

def postfix_map(list):
    yield header()
    l = (" ".join(x) for x in list)
    for line in l:
            yield line.encode('utf-8')

def dovecot_userdb_format(server):

    for entry in dovecot_userdb(server):
        yield "%s:%s:%s:%s::%s::".encode('utf-8') % (entry[0], entry[1], entry[2], entry[3], entry[4])

def dovecot_passdb_format(server):
    for entry in dovecot_passdb(server):
        yield "%s:%s".encode('utf-8') % (entry[0], entry[1])


def get_recipients(address):
    if isinstance(address.account, Account):
        return ", ".join([address.recipients, "%s@%s" % (address.address, address.domain.name)])
    else:
        return address.recipients

def get_address_iter(server):
    return (a for a in Address.enabled_objects.all() 
                if server.responsible_for(a))

def virtual_alias_map(server):
    iter = ((u"%s@%s" % (address.address, address.domain.name),
            get_recipients(address))
            for address in get_address_iter(server)
            if (address.recipient_count > 0))
    return iter

def uid(server):
    return (("%s@%s" % (a.address, a.domain.name),
            "%s" % a.uid)
            for a in get_address_iter(server)
            if a.uid is not None)

def gid(server):
    return (("%s@%s" % (a.address, a.domain.name),
            "%s" % a.gid)
            for a in get_address_iter(server)
            if a.gid is not None)

def mailbox(server):
    addresses = get_address_iter(server)
    return (("%s@%s" % (ad.address, ad.domain.name), ad.account.mailbox)
            for ad in addresses
            if ad.has_account())

def transport(server):
    return ((d.name, d.transport)
            for d in Domain.enabled_objects.all()
            if d.smtp_server == server)

def domains(server):
    return ((d.name, "novalue")
            for d in Domain.enabled_objects.all()
            if d.smtp_server == server)

def dovecot_passdb(server):
    """ Returns a simple dovecot passdb in passwd-file format

    contains two fields: username and password
    """
    account_qs = server.imap_accounts | server.pop3_accounts | server.smtp_accounts
    list = ([account.name,
            account.clean_password] for account in account_qs.distinct())
    return list

def account_address_iter(account):
    for address in account.addresses.all():
        yield address

def dovecot_userdb(server):
    """ Yields a full-blown Dovecot userdb, lacking passwords

    For the passwords, see dovecot_passdb
    """
    account_qs = server.imap_accounts | server.pop3_accounts | server.smtp_accounts
    for account in account_qs.distinct():
        yield [account.name,
            "",
            account.config.uid,
            account.config.gid,
            account.mailbox]
        for address in account_address_iter(account):
            full_address = "%s@%s" % (address.address, address.domain.name)
            if account.name != full_address:
                yield [full_address,
                        "",
                        account.config.uid,
                        account.config.gid,
                        account.mailbox]

def ejabberd_map(server):
    account_qs = server.xmpp_accounts
    for k, v in (("%s@%s" % (x.primary_address.address, x.primary_address.domain),
        x.password)
            for x in account_qs.distinct()):
        yield k, v


