"""Starter script for Staffeln API service"""

from __future__ import annotations

import os
import sys

from oslo_log import log as logging

from staffeln.api import app as api_app
from staffeln.common import service
import staffeln.conf
from staffeln.i18n import _

CONF = staffeln.conf.CONF

LOG = logging.getLogger(__name__)


def _get_ssl_configs(use_ssl):
    if use_ssl:
        cert_file = CONF.api.ssl_cert_file
        key_file = CONF.api.ssl_key_file

        if cert_file and not os.path.exists(cert_file):
            raise RuntimeError(_("Unable to find cert_file : %s") % cert_file)

        if key_file and not os.path.exists(key_file):
            raise RuntimeError(_("Unable to find key_file : %s") % key_file)

        return cert_file, key_file
    else:
        return None


def main():
    service.prepare_service(sys.argv)

    # SSL configuration
    use_ssl = CONF.api.enabled_ssl

    # Create the WSGI server and start it
    host, port = CONF.api.host, CONF.api.port

    LOG.info("Starting server in PID %s", os.getpid())
    LOG.debug("Configuration:")
    CONF.log_opt_values(LOG, logging.DEBUG)

    LOG.info(
        "Serving on %(proto)s://%(host)s:%(port)s",
        dict(proto="https" if use_ssl else "http", host=host, port=port),
    )

    api_app.run(host=host, port=port, ssl_context=_get_ssl_configs(use_ssl))
