#!/usr/bin/env python3

from urllib.parse import urlparse

from zope.component import getUtility

from twisted.internet import reactor
from twisted.application.internet import TCPServer
from twisted.application.service import Application

from storm.twisted.transact import Transactor

from canonical.txapi.server.registry import Registry

from canonical.amqp.message.interfaces import IPublisher

from canonical.twisted.site import MaxMemorySite

from canonical.landscape.api.http import combinedLogFormatterForAPI
from canonical.landscape.api.resource import ServiceAPI
from canonical.landscape.environment import get_modules
from canonical.landscape.setup import load_config, setup_broker
from canonical.landscape.scripts.api import run
from canonical.landscape.model.configuration import set_proxy_configuration


if __name__ == "__main__":
    run()

config = load_config("api")

application = Application("api")

api_config = config.get("api")
port = int(api_config["port"])
max_threads = int(api_config["threads"])

global_config = config.get("global")

root_url = api_config.get("root-url", None)
if root_url is None:
    path = "/api/"
else:
    path = urlparse(root_url).path

threadpool = reactor.getThreadPool()

transactor = Transactor(threadpool)


registry = Registry()
for module in get_modules(["api/*.py", "api/repository"]):
    registry.scan(module, ignore=[".tests"])
root = ServiceAPI(transactor, registry=registry, path=path)
site = MaxMemorySite(
    root, logFormatter=combinedLogFormatterForAPI,
    max_memory_mib=int(global_config.get("max-service-memory", 0)),
)
TCPServer(port, site).setServiceParent(application)

publisher = getUtility(IPublisher)

setup_broker(config, publisher.connected, publisher.disconnected, application)

# This transaction is run in the main thread, which is bad. Eventually
# we want to move startup-related queries in some well defined spot, which
# is guaranted to be run in the threadpool and be committed.
import transaction
set_proxy_configuration()
transaction.commit()
