from soil.agents import FSM, state, default_state
from soil.time import Delta


class Fibonacci(FSM):
    """Agent that only executes in t_steps that are Fibonacci numbers"""
    prev = 1

    @default_state
    @state
    def counting(self):
        self.log("Stopping at {}".format(self.now))
        prev, self["prev"] = self["prev"], max([self.now, self["prev"]])
        return None, Delta(prev)


class Odds(FSM):
    """Agent that only executes in odd t_steps"""

    @default_state
    @state
    def odds(self):
        self.log("Stopping at {}".format(self.now))
        return None, Delta(1 + self.now % 2)


from soil import Environment, Simulation
from networkx import complete_graph


class TimeoutsEnv(Environment):
    def init(self):
        self.init_network(generator=complete_graph, n=2)
        self.add_agent(agent_class=Fibonacci, node_id=0)
        self.add_agent(agent_class=Odds, node_id=1)


sim = Simulation(model=TimeoutsEnv, max_steps=10, interval=1)

if __name__ == "__main__":
    sim.run(dry_run=True)