import threading
import time
import random
from flask import Flask
from werkzeug.serving import make_server

ports = set()

test = False

class StoppableFlaskServer:
    def __init__(self, app, port):
        self.server = make_server('127.0.0.1', port, app)
        self.thread = threading.Thread(target=self.server.serve_forever)
        self.thread.daemon = True

    def start(self):
        self.thread.start()

    def stop(self):
        self.server.shutdown()
        self.thread.join()

# Function to create and run a Flask app on a random port for a random duration
def create_flask_app():
    app = Flask(__name__)

    @app.route('/health')
    def index():
        return "OK"

    port = random.randint(1000, 2000)
    print(f"Starting Flask app on port {port}")
    print("ports: " + ", ".join(map(str, ports)))

    server = StoppableFlaskServer(app, port)
    ports.add(port)
    print("ports: " + ", ".join(map(str, ports)))

    server.start()

    # Random duration between 10 and 30 seconds
    duration = random.randint(3, 9)
    if test:
        duration = 1000
    print(f"Flask app on port {port} will run for {duration} seconds")
    time.sleep(duration)

    print(f"Stopping Flask app on port {port}")
    ports.remove(port)
    server.stop()

# Function to spawn a new Flask app every 5 seconds
def spawn_backends():

    app = Flask(__name__)

    @app.route('/backends')
    def index():
        return list(ports)

    server = StoppableFlaskServer(app, 8080)
    server.start()

    while True:
        threading.Thread(target=create_flask_app).start()
        time.sleep(2)

if __name__ == '__main__':
    spawn_backends()