from json import dumps
#from os.path import join

from bundlewrap.metadata import MetadataJSONEncoder

actions = {
    # For some reason, this module doesn't get auto-loaded on debian,
    # even if installation of zfsutils-linux tries to start
    # zfs-mount.service. We have no choice but to do it manually.
    'modprobe_zfs': {
        'command': 'modprobe zfs',
        'unless': 'lsmod | grep ^zfs',
        'needs': {
            'pkg_apt:zfs-dkms',
        },
        'needed_by': {
            'pkg_apt:zfs-zed',
            'pkg_apt:zfsutils-linux',
            'zfs_dataset:',
            'zfs_pool:',
        },
        'comment': 'If this fails, do a dist-upgrade, reinstall zfs-dkms, reboot',
    },
}

files = {
    '/etc/modprobe.d/zfs.conf': {
        'source': 'zfs-modprobe.conf',
        'content_type': 'mako',
        'mode': '0755',
    },
    '/etc/zfs-snapshot-config.json': {
        'content': dumps(
            node.metadata.get('zfs/snapshots', {}),
            cls=MetadataJSONEncoder,  # turns sets into sorted lists
            indent=4,
            sort_keys=True,
        ) + '\n',
    },
    '/etc/zfs/zed.d/zed.rc': {
        'content': 'ZED_EMAIL_ADDR="hostmaster@kunbox.net"\nZED_EMAIL_PROG="mail"\nZED_NOTIFY_INTERVAL_SECS=3600\n',
        'mode': '0600',
        'triggers': {
            'svc_systemd:zfs-zed:restart'
        },
    },
    '/usr/local/sbin/zfs-auto-snapshot': {
        'mode': '0755',
    },
    '/usr/local/share/icinga/plugins/check_zfs_auto_snapshot': {
        'mode': '0755',
    },
    '/usr/local/share/icinga/plugins/check_zfs_old_snapshots': {
        'mode': '0755',
    },
    "/usr/local/share/icinga/plugins/check_zfs_volumes": {
        'mode': '0755',
        'content_type': 'mako',
    },
    "/usr/local/share/icinga/plugins/check_zpool_online": {
        'mode': '0755',
    },
    "/usr/local/share/icinga/plugins/check_zpool_space": {
        'mode': '0755',
    },
}

svc_systemd = {
    'zfs-zed': {
        'needs': {
            'pkg_apt:zfs-zed'
        },
    },
}

zfs_datasets = node.metadata.get('zfs/datasets', {})
zfs_pools = {}

for name, attrs in node.metadata.get('zfs/pools', {}).items():
    zfs_pools[name] = attrs

    # Not yet supported on debian buster
    #actions[f'pool_{name}_enable_trim'] = {
    #    'command': f'zpool set autotrim=on {name}',
    #    'unless':  f'zpool get autotrim -H -o value {name} | grep -q on',
    #    'needs':   [
    #        f'zfs_pool:{name}'
    #    ]
    #}

directories = {
    "/etc/zfs-snapshot-backup-pre.d": {
        'purge': True,
    },
    "/etc/zfs-snapshot-backup-post.d": {
        'purge': True,
    },
}

if node.metadata.get('zfs/filesystems_with_backup_snapshots', {}) and node.has_bundle('backup-client'):
    files['/etc/backup-pre-hooks.d/99-zfs-snapshots'] = {
        'content_type': 'mako',
        'source': 'backup-pre-hook',
        'mode': '0755',
    }