# This need to be first
import eventlet
eventlet.monkey_patch()

import logging  # noqa: E402

from flask import Flask  # noqa: E402

from bricktracker.app import setup_app  # noqa: E402
from bricktracker.socket import BrickSocket  # noqa: E402

logger = logging.getLogger(__name__)


# Create the app
# Using 'app' globally interferse with the teardown handlers of Flask
def create_app(main: bool = False, /) -> Flask | BrickSocket:
    # Create the Flask app
    app = Flask(__name__)

    # Setup the app
    setup_app(app)

    # Create the socket
    s = BrickSocket(
        app,
        threaded=not app.config['NO_THREADED_SOCKET'],
    )

    if main:
        return s
    else:
        return app


if __name__ == '__main__':
    s = create_app(True)

    # This never happens, but makes the linter happy
    if isinstance(s, Flask):
        logger.critical('Cannot run locally with a Flask object, needs a BrickSocket. Use create_app(True) to return a BrickSocket')  # noqa: E501
        exit(1)

    # Run the application
    logger.info('Starting BrickTracker on {host}:{port}'.format(
        host=s.app.config['HOST'],
        port=s.app.config['PORT'],
    ))
    s.socket.run(
        s.app,
        host=s.app.config['HOST'],
        debug=s.app.config['DEBUG'],
        port=s.app.config['PORT'],
    )