import string
from uuid import UUID

defaults = {
    'apt': {
        'packages': {
            'php': {},
            'php-redis': {},
            'php-fpm': {},
            'php-curl': {},
            'php-gd': {},
            'php-json': {},
            'php-xml': {},
            'php-mbstring': {},
            'php-cli': {},
            'php-cgi': {},
            'php-zip': {},
            'php-pgsql': {},
            'php-intl': {},
            'php-imagick': {},
            'libmagickcore-6.q16-6-extra': {},
            'php-gmp': {},
            'php-bcmath': {},
        },
    },
    'archive': {
        'paths': {
            '/var/lib/nextcloud': {
                'exclude': [
                    '^appdata_',
                    '^updater-',
                    '^nextcloud\\.log',
                    '^updater\\.log',
                    '^[^/]+/cache',
                    '^[^/]+/files_versions',
                    '^[^/]+/files_trashbin',
                ],
            },
        },
    },
    'backup': {
        'paths': {
            '/etc/nextcloud/config.php',
        },
    },
    'nextcloud': {
        'admin_user': 'admin',
        'admin_pass': repo.vault.password_for(f'{node.name} nextcloud admin pw').value,
        'config': {},
    },
    'php': {
        'post_max_size': '32G',
        'www.conf': {
            'env[HOSTNAME]': '$HOSTNAME',
            'env[PATH]': '/usr/local/bin:/usr/bin:/bin',
            'env[TMP]': '/tmp',
            'env[TMPDIR]': '/tmp',
            'env[TEMP]': '/tmp',
        },
        'php.ini': {
            'PHP': {
                'memory_limit': '3G', # face recognition requires 2G
            },
        },
    },
    'postgresql': {
        'roles': {
            'nextcloud': {
                'password': repo.vault.password_for(f'{node.name} nextcloud db pw').value,
            },
        },
        'databases': {
            'nextcloud': {
                'owner': 'nextcloud',
            },
        },
    },
    'redis': {
        'nextcloud': {},
    },
    'systemd-timers': {
        'nextcloud-cron': {
            'command': '/usr/bin/php -f /opt/nextcloud/cron.php',
            'when': '*:0/5',
            'user': 'www-data',
            'kill_mode': 'process',
        },
        'nextcloud-rescan': {
            'command': '/opt/nextcloud_rescan',
            'when': 'Sun 00:00:00',
            'user': 'www-data',
        },
    },
}


@metadata_reactor.provides(
    'nextcloud/config',
)
def config(metadata):
    return {
        'nextcloud': {
            'config': {
                'dbuser': 'nextcloud',
                'dbpassword': metadata.get('postgresql/roles/nextcloud/password'),
                'dbname': 'nextcloud',
                'dbhost': 'localhost',
                'dbtype': 'pgsql',
                'dbtableprefix': 'oc_',
                'datadirectory': '/var/lib/nextcloud',
                'dbport': '5432',
                'apps_paths': [
                    {
                        'path': '/opt/nextcloud/apps',
                        'url': '/apps',
                        'writable': False
                    },
                    {
                        'path': '/var/lib/nextcloud/.userapps',
                        'url': '/userapps',
                        'writable': True
                    }
                ],
                'cache_path': '/var/lib/nextcloud/.cache',
                'upgrade.disable-web': True,
                'memcache.local': '\\OC\\Memcache\\Redis',
                'memcache.locking': '\\OC\\Memcache\\Redis',
                'memcache.distributed': '\\OC\\Memcache\\Redis',
                'redis': {
                    'host': '/var/run/redis/nextcloud.sock'
                },
                'trusted_domains': [
                    'localhost',
                    '127.0.0.1',
                    metadata.get('nextcloud/hostname'),
                ],
                'log_type': 'syslog',
                'syslog_tag': 'nextcloud',
                'logfile': '',
                'loglevel': 3,
                'default_phone_region': 'DE',
                'versions_retention_obligation': 'auto, 90',
                'simpleSignUpLink.shown': False,
                'allow_local_remote_servers': True, # FIXME?
                'maintenance_window_start': 1, # https://docs.nextcloud.com/server/29/admin_manual/configuration_server/background_jobs_configuration.html#maintenance-window-start
            },
        },
    }


@metadata_reactor.provides(
    'zfs/datasets',
)
def zfs(metadata):
    return {
        'zfs': {
            'datasets': {
                f"{metadata.get('zfs/storage_classes/hdd')}/nextcloud": {
                    'mountpoint': '/var/lib/nextcloud',
                    'needed_by': [
                        'bundle:nextcloud',
                    ],
                },
            },
        },
    }


@metadata_reactor.provides(
    'nginx/vhosts'
)
def vhost(metadata):
    return {
        'nginx': {
            'vhosts': {
                metadata.get('nextcloud/hostname'): {
                    'content': 'nextcloud/vhost.conf',
                    'context': {
                        'root': '/opt/nextcloud',
                    },
                },
            },
        },
    }