defaults = {
}


@metadata_reactor.provides(
    'php/php.ini',
)
def php_ini(metadata):
    conf = {
        'PHP': {
            'engine': 'On',
            'short_open_tag': 'Off',
            'precision': '14',
            'output_buffering': '4096',
            'zlib.output_compression': 'Off',
            'implicit_flush': 'Off',
            'serialize_precision': '-1',
            'ignore_user_abort': 'Off',
            'zend.enable_gc': 'On',
            'expose_php': 'Off',
            'max_execution_time': '300',
            'max_input_time': '600',
            'memory_limit': '512M',
            'error_reporting': '"E_ALL & ~E_DEPRECATED & ~E_STRICT"',
            'display_startup_errors': 'Off',
            'log_errors': 'On',
            'log_errors_max_len': '1024',
            'ignore_repeated_errors': 'Off',
            'ignore_repeated_source': 'Off',
            'report_memleaks': 'On',
            'html_errors': 'On',
            'error_log': 'syslog',
            'syslog.ident': 'php',
            'syslog.filter': 'ascii',
            'arg_separator.output': '"&"',
            'variables_order': 'GPCS',
            'request_order': 'GP',
            'register_argc_argv': 'Off',
            'auto_globals_jit': 'On',
            'post_max_size': '32g',
            'default_mimetype': 'text/html',
            'default_charset': 'UTF-8',
            'enable_dl': 'Off',
            'file_uploads': 'On',
            'upload_max_filesize': '32g',
            'max_file_uploads': '2000',
            'allow_url_fopen': 'On',
            'allow_url_include': 'Off',
            'default_socket_timeout': '10',
        },
        'CLI Server': {
            'cli_server.color': 'On',
        },
        'mail function': {
            'mail.add_x_header': 'Off',
        },
        'ODBC': {
            'odbc.allow_persistent': 'On',
            'odbc.check_persistent': 'On',
            'odbc.max_persistent': '-1',
            'odbc.max_links': '-1',
            'odbc.defaultlrl': '4096',
            'odbc.defaultbinmode': '1',
        },
        'PostgreSQL': {
            'pgsql.allow_persistent': 'On',
            'pgsql.auto_reset_persistent': 'Off',
            'pgsql.max_persistent': '-1',
            'pgsql.max_links': '-1',
            'pgsql.ignore_notice': '0',
            'pgsql.log_notice': '0',
        },
        'bcmath': {
            'bcmath.scale': '0',
        },
        'Session': {
            'session.save_handler': 'files',
            'session.use_strict_mode': '0',
            'session.use_cookies': '1',
            'session.use_only_cookies': '1',
            'session.name': 'PHPSESSID',
            'session.auto_start': '0',
            'session.cookie_lifetime': '0',
            'session.cookie_path': '/',
            'session.cookie_domain': '',
            'session.cookie_httponly': '',
            'session.cookie_samesite': '',
            'session.serialize_handler': 'php',
            'session.gc_probability': '1',
            'session.gc_divisor': '1000',
            'session.gc_maxlifetime': '1440',
            'session.referer_check': '',
            'session.cache_limiter': 'nocache',
            'session.cache_expire': '180',
            'session.use_trans_sid': '0',
            'session.sid_length': '32',
            'session.trans_sid_tags': '"a=href,area=href,frame=src,form="',
            'session.sid_bits_per_character': '6',
        },
        'Assertion': {
            'zend.assertions': '-1',
        },
        'Date': {
            'date.timezone': 'Europe/London',
        },
        'opcache': {
            'opcache.enable': '1',
            'opcache.interned_strings_buffer': '32',
            'opcache.max_accelerated_files': '20000',
            'opcache.memory_consumption': '1024',
            'opcache.save_comments': '1',
            'opcache.validate_timestamps': '1',
            'opcache.revalidate_freq': '60',
        },
    }
    
    return {
        'php': {
            'php.ini': {
                section: {
                    key: value
                        for key, value in options.items()
                        if not metadata.get(f'php/php.ini/{section}/{key}', None)
                }
                    for section, options in conf.items()
            }
        },
    }


@metadata_reactor.provides(
    'php/www.conf',
)
def www_conf(metadata):
    threads = metadata.get('vm/threads', metadata.get('vm/cores', 4))

    return {
        'php': {
            'www.conf': {
                'user': 'www-data',
                'group': 'www-data',
                'listen': f"/run/php/php{metadata.get('php/version')}-fpm.sock",
                'listen.owner': 'www-data',
                'listen.group': 'www-data',
                'pm': 'dynamic',
                'pm.max_children': int(threads*2),
                'pm.start_servers': int(threads),
                'pm.min_spare_servers': int(threads/2),
                'pm.max_spare_servers': int(threads),
                'pm.max_requests': int(threads*32),
            },
        },
    }


@metadata_reactor.provides(
    'apt/packages',
)
def apt(metadata):
    return {
        'apt': {
            'packages': {
                f"php{metadata.get('php/version')}": {},
                f"php{metadata.get('php/version')}-fpm": {},
            },
        },
    }