defaults = {
    'backups': {
        'paths': {
            '/var/lib/postgresql',
        },
    },
    'bash_functions': {
        'pg_query_mon': "watch -n 2 \"echo \\\"SELECT pid, age(clock_timestamp(), query_start), usename, query FROM pg_stat_activity WHERE query != '<IDLE>' AND query NOT ILIKE '%pg_stat_activity%' ORDER BY query_start desc;\\\" | psql postgres\""
    },
    'icinga2_api': {
        'postgresql': {
            'services': {
                'POSTGRESQL PROCESS': {
                    'command_on_monitored_host': '/usr/lib/nagios/plugins/check_procs -C postgres -c 1:',
                },
            },
        },
    },
    'postgresql': {
        'max_connections': 100,
        'autovacuum_max_workers': 3,
        'maintenance_work_mem': 64,
        'work_mem': 4,
        'shared_buffers': 128,
        'temp_buffers': 8,
        'slow_query_log_sec': 0,
    },
}

if node.has_bundle('telegraf'):
    defaults['telegraf'] = {
        'input_plugins': {
            'builtin': {
                'postgresql': [{
                    'address': repo.vault.password_for(f'{node.name} postgresql telegraf').format_into('postgres://telegraf:{}@localhost:5432/telegraf?sslmode=disable'),
                    'ignored_databases': [
                        'template0',
                        'template1',
                        'telegraf',
                    ],
                }],
            },
        },
    }
    defaults['postgresql'].update({
        'roles': {
            'telegraf': {
                'password': repo.vault.password_for(f'{node.name} postgresql telegraf'),
            },
        },
        'databases': {
            'telegraf': {
                'owner': 'telegraf',
            },
        },
    })

if node.has_bundle('zfs'):
    defaults['zfs'] = {
        'datasets': {
            'tank/postgresql': {
                'mountpoint': '/var/lib/postgresql',
            },
        },
    }
else:
    defaults['backups']['paths'].add('/var/tmp/postgresdumps')


@metadata_reactor.provides(
    'apt/repos/postgresql',
    'postgresql/version',
)
def default_postgresql_version_for_debian(metadata):
    # <https://packages.debian.org/search?keywords=postgresql>
    versions_in_debian = {
        '10': '11', # buster
        '11': '13', # bullseye
    }
    os = str(node.os_version[0])
    version_to_be_installed = metadata.get('postgresql/version', versions_in_debian[os])

    if version_to_be_installed != versions_in_debian[os]:
        return {
            'apt': {
                'repos': {
                    'postgresql': {
                        'items': {
                            'deb https://apt.postgresql.org/pub/repos/apt/ {os_release}-pgdg main',
                        },
                    },
                },
            },
            'postgresql': {
                'version': version_to_be_installed,
            },
        }

    return {
        'postgresql': {
            'version': version_to_be_installed,
        },
    }


@metadata_reactor.provides(
    'postgresql/effective_io_concurrency',
    'postgresql/max_worker_processes',
    'postgresql/max_parallel_workers',
    'postgresql/max_parallel_workers_per_gather',
)
def worker_processes(metadata):
    return {
        'postgresql': {
            # This is the amount of parallel I/O Operations the
            # postgresql process is allowed to do on disk. We set
            # this to max_connections by default.
            'effective_io_concurrency': metadata.get('postgresql/max_connections'),

            # Try to request one worker process per 10 configured
            # connections. The default is 8 for both of these values.
            'max_worker_processes': int(metadata.get('postgresql/max_connections')/10),
            'max_parallel_workers': int(metadata.get('postgresql/max_connections')/10),
            # default 2
            'max_parallel_workers_per_gather': max(int(metadata.get('postgresql/max_connections')/100), 2),
        },
    }