import pprint

import yaml

from collections import defaultdict
from collections.abc import Mapping

def cast_database_mode(value):
    if value:
        return 'internal'
    return 'external'

MAP = {
        ('foreman', 'db_host'): 'database_host',
        ('foreman', 'db_port'): 'database_port',
        ('foreman', 'db_database'): 'foreman_database_name',
        ('foreman', 'db_username'): 'foreman_database_user',
        ('foreman', 'db_password'): 'foreman_database_password',
        ('foreman', 'db_manage'): ('database_mode', cast_database_mode),
        ('foreman', 'db_manage_rake'): 'IGNORE',
        
        ('foreman', 'foreman_url'): 'foreman_url',

        ('foreman', 'initial_admin_username'): 'foreman_initial_admin_username',
        ('foreman', 'initial_admin_password'): 'foreman_initial_admin_password',
        ('foreman', 'initial_organization'): 'IGNORE',
        ('foreman', 'initial_location'): 'IGNORE',

        # We don't allow setting oauth_effective_user in Ansible, should we?
        ('foreman', 'oauth_consumer_key'): 'foreman_oauth_consumer_key',
        ('foreman', 'oauth_consumer_secret'): 'foreman_oauth_consumer_secret',

        # the passwords are missing from answers, wtf
        # see https://redhat-internal.slack.com/archives/C04T3JZ5W8K/p1759762988503159
        ('katello', 'candlepin_db_name'): 'candlepin_database_name',
        ('katello', 'candlepin_db_user'): 'candlepin_database_user',
        ('katello', 'candlepin_db_password'): 'candlepin_database_password',
        ('katello', 'candlepin_db_host'): 'IGNORE',
        ('katello', 'candlepin_db_ssl_verify'): 'IGNORE',
        ('katello', 'candlepin_manage_db'): 'IGNORE',
        # We don't allow setting the key in Ansible, should we?
        ('katello', 'candlepin_oauth_secret'): 'candlepin_oauth_secret',
        ('foreman_proxy_content', 'pulpcore_postgresql_user'): 'pulp_database_user',
        ('foreman_proxy_content', 'pulpcore_postgresql_password'): 'pulp_database_password',
        ('foreman_proxy_content', 'pulpcore_postgresql_db_name'): 'pulp_database_name',
        ('foreman_proxy_content', 'pulpcore_manage_postgresql'): 'IGNORE',
        ('foreman_proxy_content', 'pulpcore_postgresql_host'): 'IGNORE',
        ('foreman_proxy_content', 'pulpcore_postgresql_port'): 'IGNORE',
        ('foreman_proxy_content', 'pulpcore_postgresql_ssl_require'): 'IGNORE',
        ('foreman_proxy_content', 'pulpcore_postgresql_ssl_cert'): 'IGNORE',
        ('foreman_proxy_content', 'pulpcore_postgresql_ssl_key'): 'IGNORE',
        ('foreman_proxy_content', 'pulpcore_postgresql_ssl_root_ca'): 'IGNORE',
        # secret key is missing
      }

with open('/etc/foreman-installer/scenarios.d/satellite-answers.yaml') as answers_yaml:
    answers = yaml.safe_load(answers_yaml)

result = {}
remaining = defaultdict(dict)

for (module, param), variable in MAP.items():
    if (value := answers.get(module, {}).pop(param, None)) is not None:
        if variable != 'IGNORE':
            if isinstance(variable, tuple):
                var, fun = variable
                result[var] = fun(value)
            else:
                result[variable] = value

for module, values in answers.items():
    # we have no support for proxy yet
    if module == 'foreman_proxy' or module.startswith('foreman_proxy::'):
        continue
    # we have no support for iop yet
    if module == 'iop':
        continue
    if values and isinstance(values, Mapping):
        for key, value in values.items():
            # ignore version data
            if key == 'version':
                continue
            if value:
                remaining[module][key] = value

pprint.pp(remaining)

pprint.pp(result)
