BareGit
#pragma once

#include <exception>

#include "configuration.h"
#include "data_source_interface.h"

#include <mw/http_server.hpp>

/// HTTP application serving the status tracker UI.
class App : public mw::HTTPServer
{
public:
    /// Configure the listener, service definitions, and status storage.
    /// The data source must outlive the application.
    App(const ListenAddress& listen, Configuration configuration,
        DataSourceInterface& data_source);

protected:
    /// Register HTTP routes before the server starts.
    void setup() override;

private:
    /// Render the grouped service status page.
    void serveIndex(const Request& request, Response& response) const;

    /// Serve one embedded static resource.
    static void serveStatic(const Request& request, Response& response);

    /// Convert unexpected request exceptions into process termination.
    static void unexpectedException(const Request& request,
                                    Response& response,
                                    std::exception_ptr exception) noexcept;

    Configuration configuration;
    DataSourceInterface& data_source;
};