"""Example simulation with custom random nodes."""

__author__ = "Jarrod Pas <j.pas@usask.ca>"

from random import Random

from pydtn import Network, Node, random_trace, random_traffic


class RandomNode(Node):
    """Node that sends packets to a random neightbour."""

    def __init__(self, seed=None, **options):
        """
        Create a random node.

        Keyword Arguments:
        seed -- seed for random number generator
        """
        super().__init__(**options)
        self.random = Random(seed)

    def forward(self, packet):
        """Pick a random neighbour to send packet to."""
        neighbours = list(self.neighbours)
        if neighbours:
            target = self.random.choice(neighbours)
            return {target: 'random'}
        return {}


def main():
    """Run a simulation with random nodes."""
    duration = 500
    nodes = 50
    seed = 42

    node_options = {
        'seed': seed,
        'tick_rate': 1,
    }
    nodes = {
        node_id: RandomNode(**node_options)
        for node_id in range(nodes)
    }

    traffic_options = {
        'seed': seed,
        'speed': 1,
    }
    traffic = random_traffic(nodes, **traffic_options)

    trace_options = {
        'seed': seed,
    }
    trace = random_trace(nodes, **trace_options)

    network = Network(nodes, traffic=traffic, trace=trace)
    network.run(until=duration)

    print(network.stats_summary)


if __name__ == '__main__':
    exit(main())