import wx


def format_byte(bytes, format='%.2f%s'):
    if bytes > 1024 * 1024 * 1024:
        return format % (bytes / 1024.0 / 1024 / 1024, 'GB')
    elif bytes > 1024 * 1024:
        return format % (bytes / 1024.0 / 1024, 'MB')
    elif bytes > 1024:
        return format % (bytes / 1024.0, 'KB')
    else:
        return format % (bytes, 'B')



class ItemBoxSizer(wx.BoxSizer):
    def __init__(self, parent, current_byte, total_byte, **kwargs):
        wx.BoxSizer.__init__(self, wx.HORIZONTAL)
        self.SetMinSize(wx.Size(-1, 10))
        self.parent = parent

        self.text_name = None
        self.text_percent = None
        self.text_speed = None
        self.text_progress = None

        self.total = total_byte

        self.gauge_progress = None

        self.initWidget(current=current_byte, **kwargs)



    def initWidget(self, **kwargs):

        name = kwargs.get('name', '')
        current = kwargs.get('current', 0)
        percent = current*100.0 / self.total if self.total > 0 else 0
        speed = format_byte(kwargs.get('speed', 0), '%.1f%s/S')

        self.text_name = wx.StaticText(self.parent, wx.ID_ANY, name, wx.DefaultPosition, wx.Size(20, -1),
                                       wx.ALIGN_RIGHT)
        self.text_percent = wx.StaticText(self.parent, wx.ID_ANY, str(round(percent, 1)) + '%', wx.DefaultPosition,
                                          wx.Size(40, -1), wx.ALIGN_RIGHT)
        self.text_speed = wx.StaticText(self.parent, wx.ID_ANY, speed, wx.DefaultPosition, wx.Size(65, -1),
                                        wx.ALIGN_RIGHT)

        self.text_name.Wrap(-1)
        self.text_percent.Wrap(-1)
        self.text_speed.Wrap(-1)

        self.gauge_progress = wx.Gauge(self.parent, wx.ID_ANY, 10000, wx.DefaultPosition, wx.DefaultSize,
                                       wx.GA_HORIZONTAL)
        self.gauge_progress.SetValue(int(percent*100))

        self.Add(self.text_name, 0, wx.ALIGN_RIGHT | wx.ALL, 5)
        self.Add(self.gauge_progress, 5, wx.ALL, 5)
        self.Add(self.text_percent, 0, wx.ALL, 5)
        self.Add(self.text_speed, 0, wx.ALL, 5)
        # self.Add(self.text_progress, 0, wx.ALL, 5)
        staticline1 = wx.StaticLine(self.parent, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL)

        self.Add(staticline1, 0, wx.EXPAND | wx.ALL, 2)

    def update(self, current_byte, speed_byte, totol_byte):
        self.total = totol_byte if totol_byte > 0 else 0
        percent = current_byte * 100.0 / self.total if self.total > 0 else 0
        speed = format_byte(speed_byte if speed_byte > 0 else 0, '%.1f%s/s')

        text_percent = str(round(percent, 1)) + '%'
        if text_percent != self.text_percent.GetLabelText():
            self.text_percent.SetLabelText(text_percent)

        if speed != self.text_speed.GetLabelText():
            self.text_speed.SetLabelText(speed)

        self.gauge_progress.SetValue(int(percent*100))