from bundlewrap.metadata import atomic

defaults = {
    'apt': {
        'packages': {
            'dovecot-fts-xapian': {},
            'dovecot-imapd': {},
            'dovecot-lmtpd': {},
            'dovecot-managesieved': {},
            'dovecot-pgsql': {},
            'dovecot-sieve': {},
        },
    },
    'icinga2_api': {
        'dovecot': {
            'services': {
                'DOVECOT PROCESS': {
                    'command_on_monitored_host': '/usr/local/share/icinga/plugins/check_systemd_unit dovecot',
                },
                'IMAP CONNECT': {
                    'check_command': 'check_imap',
                    'vars.imap_port': 143,
                    'vars.notification.sms': True,
                },
                'IMAPS CONNECT': {
                    'check_command': 'check_imap',
                    'vars.imap_port': 993,
                    'vars.imap_ssl': True,
                    'vars.notification.sms': True,
                },
            },
        },
    },
    'letsencrypt': {
        'reload_after': {
            'dovecot',
        },
    },
    'systemd-timers': {
        'timers': {
            'dovecot_fts_optimize': {
                'command': [
                    '/usr/bin/doveadm fts optimize -A',
                ],
                'when': '02:{}:00'.format(node.magic_number % 60),
            },
        },
    },
}

if node.has_bundle('postfixadmin'):
    defaults['dovecot'] = {
        'database': {
            'dbname': 'postfixadmin',
            'dbuser': 'postfixadmin',
        },
    }

if node.has_bundle('telegraf'):
    defaults['telegraf'] = {
        'input_plugins': {
            'builtin': {
                'dovecot': [{
                    'type': 'global',
                }],
            },
        },
    }


@metadata_reactor.provides(
    'dovecot/admin_email',
    'dovecot/database/dbpass',
)
def import_database_settings_from_postfixadmin(metadata):
    if not node.has_bundle('postfixadmin'):
        raise DoNotRunAgain

    return {
        'dovecot': {
            'admin_email': metadata.get('postfixadmin/admin_email'),
            'database': {
                'dbpass': metadata.get('postgresql/roles/postfixadmin/password'),
            },
        },
    }


@metadata_reactor.provides(
    'firewall/port_rules',
    'firewall/port_rules',
    'firewall/port_rules',
)
def firewall(metadata):
    return {
        'firewall': {
            'port_rules': {
                # imap(s)
                '143/tcp': atomic(metadata.get('dovecot/restrict-to', {'*'})),
                '993/tcp': atomic(metadata.get('dovecot/restrict-to', {'*'})),
                # managesieve
                '4190/tcp': atomic(metadata.get('dovecot/restrict-to', {'*'})),
            },
        },
    }
