import threading
import time
import random

class Simulator:
    def __init__(self, initial_instances=2, scale_up_threshold=80, scale_down_threshold=20):
        self.instances = [f"instance-{i}" for i in range(initial_instances)]
        self.load = 50  # Initial load.
        self.running = False
        self.lock = threading.Lock()
        self.scale_up_threshold = scale_up_threshold
        self.scale_down_threshold = scale_down_threshold
        self.max_instances = 10 # Limit to prevent excessive scaling.
        self.min_instances = 1 # Prevent going to zero.

    def start(self):
        self.running = True
        self.thread = threading.Thread(target=self._run)
        self.thread.start()

    def stop(self):
        self.running = False
        self.thread.join()

    def set_load(self, load):
        with self.lock:
            self.load = load

    def _run(self):
        while self.running:
            with self.lock:
                if self.load > self.scale_up_threshold and len(self.instances) < self.max_instances:
                    self._scale_up()
                elif self.load < self.scale_down_threshold and len(self.instances) > self.min_instances:
                    self._scale_down()
            time.sleep(1)

    def _scale_up(self):
        new_instance_id = len(self.instances)
        new_instance = f"instance-{new_instance_id}"
        self.instances.append(new_instance)
        print(f"Scaled up: Added instance {new_instance}")

    def _scale_down(self):
        instance_to_remove = self.instances.pop()
        print(f"Scaled down: Removed instance {instance_to_remove}")
