from mgba.image import Image
from collections import namedtuple
from . import VideoFrame

Output = namedtuple('Output', ['video'])


class Tracer(object):
    def __init__(self, core):
        self.core = core
        self.framebuffer = Image(*core.desired_video_dimensions())
        self.core.set_video_buffer(self.framebuffer)
        self._video_fifo = []

    def yield_frames(self, skip=0, limit=None):
        self.core.reset()
        skip = (skip or 0) + 1
        while skip > 0:
            frame = self.core.frame_counter
            self.core.run_frame()
            skip -= 1
        while frame <= self.core.frame_counter and limit != 0:
            self._video_fifo.append(VideoFrame(self.framebuffer.to_pil()))
            yield frame
            frame = self.core.frame_counter
            self.core.run_frame()
            if limit is not None:
                assert limit >= 0
                limit -= 1

    def video(self, generator=None, **kwargs):
        if not generator:
            generator = self.yield_frames(**kwargs)
        try:
            while True:
                if self._video_fifo:
                    yield self._video_fifo.pop(0)
                else:
                    next(generator)
        except StopIteration:
            return
