"""
A  basic widget for showing the progress
being made in a task.

"""
from __future__ import division

from tkinter import *
from past.utils import old_div
from builtins import object
from future import standard_library
standard_library.install_aliases()


class ProgressBar(object):
    def __init__(self, master=None, orientation="horizontal",
                 min=0, max=100, width=100, height=18,
                 doLabel=1, appearance="sunken",
                 fillColor="blue", background="gray",
                 labelColor="yellow", labelFont="Verdana",
                 labelText="", labelFormat="%d%%",
                 value=50, bd=2):
        # preserve various values
        self.master = master
        self.orientation = orientation
        self.min = min
        self.max = max
        self.width = width
        self.height = height
        self.doLabel = doLabel
        self.fillColor = fillColor
        self.labelFont = labelFont
        self.labelColor = labelColor
        self.background = background
        self.labelText = labelText
        self.labelFormat = labelFormat
        self.value = value
        self.frame = Frame(master, relief=appearance, bd=bd)
        self.canvas = Canvas(self.frame, height=height, width=width, bd=0,
                             highlightthickness=0, background=background)
        self.scale = self.canvas.create_rectangle(0, 0, width, height,
                                                  fill=fillColor)
        self.label = self.canvas.create_text(old_div(self.canvas.winfo_reqwidth(), 2),
                                             old_div(height, 2), text=labelText,
                                             anchor="c", fill=labelColor,
                                             font=self.labelFont)
        self.update()
        self.canvas.pack(side='top', fill='x', expand='no')

    def updateProgress(self, newValue, newMax=None):
        if newMax:
            self.max = newMax
        self.value = newValue
        self.update()

    def update(self):
        # Trim the values to be between min and max
        value = self.value
        if value > self.max:
            value = self.max
        if value < self.min:
            value = self.min
        # Adjust the rectangle
        if self.orientation == "horizontal":
            self.canvas.coords(self.scale, 0, 0,
                               float(value) / self.max * self.width, self.height)
        else:
            self.canvas.coords(self.scale, 0,
                               self.height - (float(value) /
                                              self.max*self.height),
                               self.width, self.height)
        # Now update the colors
        self.canvas.itemconfig(self.scale, fill=self.fillColor)
        self.canvas.itemconfig(self.label, fill=self.labelColor)
        # And update the label
        if self.doLabel:
            if value:
                if value >= 0:
                    pvalue = int((float(value) / float(self.max)) * 100.0)
                else:
                    value = 0
                self.canvas.itemconfig(
                    self.label, text=self.labelFormat % value)
            else:
                self.canvas.itemconfig(self.label, text='')
        else:
            self.canvas.itemconfig(
                self.label, text=self.labelFormat % self.labelText)
        self.canvas.update_idletasks()
