import numpy as np


class Sampler:

    def __init__(self, n=10, p=0.5, trials=1000):
        self.trials = trials
        self.n = n
        self.p = p
        self._samp = None

    def resample(self):
        self._samp = np.random.binomial(self.n, self.p, self.trials)

    def get_sample(self):
        if self._samp is None:
            self.resample()
        return self._samp


class Plankton:

    def __init__(self, name="", desc="", samples_per_frame=10, sample_prob=0.5, total_frames=1000, sampler=Sampler()):
        self.name = name
        self.desc = desc
        self.sampler = sampler
        self.sampler.n = samples_per_frame
        self.sampler.p = sample_prob
        self.sampler.trials = total_frames

    def sample(self, volume):
        return self.sampler.get_sample()


class Copepod(Plankton):

    def __init__(self, name="", desc="", samples_per_frame=10, sample_prob=0.5, total_frames=1000, sampler=Sampler()):
        super().__init__(name, desc, samples_per_frame, sample_prob, total_frames, sampler)

