from queue import Empty
import wx

from platypush.plugins.camera.model.writer.preview import PreviewWriter


class Panel(wx.Panel):
    def __init__(self, parent, process, width: int, height: int):
        import wx

        super().__init__(parent, -1)

        self.process: PreviewWriter = process
        self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
        self.SetSize(width, height)
        self.Bind(wx.EVT_PAINT, self.on_paint)
        self.update()

    @staticmethod
    def img_to_bitmap(image) -> wx.Bitmap:
        import wx

        return wx.Bitmap.FromBuffer(image.width, image.height, image.tobytes())

    def get_bitmap(self):
        try:
            return self.process.bitmap_queue.get(block=True, timeout=1.0)
        except Empty:
            return None

    def update(self):
        import wx

        self.Refresh()
        self.Update()
        wx.CallLater(15, self.update)

    def create_bitmap(self):
        image = self.get_bitmap()
        if image is None:
            return

        return self.img_to_bitmap(image)

    def on_paint(self, *_, **__):
        import wx

        bitmap = self.create_bitmap()
        if not bitmap:
            return

        dc = wx.AutoBufferedPaintDC(self)
        dc.DrawBitmap(bitmap, 0, 0)


class Frame(wx.Frame):
    def __init__(self, process):
        import wx

        style = wx.DEFAULT_FRAME_STYLE & ~wx.RESIZE_BORDER & ~wx.MAXIMIZE_BOX
        self.process = process
        image = self.process.bitmap_queue.get()

        super().__init__(
            None, -1, process.camera.info.device or 'Camera Preview', style=style
        )
        self.Bind(wx.EVT_WINDOW_DESTROY, self.on_close)
        self.panel = Panel(self, process, width=image.width, height=image.height)
        self.Fit()

    def on_close(self, *_, **__):
        self.process.close()


# vim:sw=4:ts=4:et:
