#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
import datetime

# Make it work on Python2 and Python3
if sys.version_info.major == 2:
	from Tkinter import *
	from ttk import *
else:
	from tkinter import *
	from tkinter.ttk import *

# How much money per hour?
MONEY_PER_HOUR = 100
HOURS_OF_DAY = 8
FORM_WIDTH = 180
FORM_HEIGHT = 130

# Use vanilla minute handling, no time/date/datetime
def str_to_minutes(timestr):
	if not timestr:
		return -1

	tmp = timestr.split(':')
	return (int(tmp[0]) * 60) + int(tmp[1])

def minutes_to_str(mins):	
	mins = abs(mins)
	hrs = int(mins / 60)
	mins -= hrs * 60
	return "%02d:%02d" % (hrs, mins)

# Tk stuff
class Application(Frame):
	def __init__(self, master=None):
		Frame.__init__(self, master)

		# Top widget. Hide it instantly as we will move it later
		self.top = self.winfo_toplevel()
		self.top.withdraw()

		# Variables for controls (labels)
		self.bisher = StringVar()
		self.bisher.set("00:00")
		self.eur = StringVar()
		self.eur.set("0")
		self.nochda = StringVar()
		self.nochda.set("00:00")
		self.countdown = StringVar()
		self.countdown.set("00:00")
		self.countdownlabel = StringVar()
		self.countdownlabel.set("")

		# Variables for controls (input)
		self.start = StringVar()
		self.mittag = StringVar()
		self.mende = StringVar()

		# Timer control
		self.run_timer = False

		# Converted minutes
		self.mins_start = 0
		self.mins_mittag = 0
		self.mins_mende = 0

		# Disallow sizing of the main window
		self.top.resizable(False, False)

		# Create all client widgets
		self.create_widgets()

		# Grid all
		self.grid()
		self.top.grid()

		# Center main window
		self.center_window()

		# Show window again
		self.top.deiconify()

		# Return handler
		self.top.bind('<Return>', lambda e: self.return_hit())

	def center_window(self):
		# Center on screen
		self.top.update_idletasks()
		xp = (self.top.winfo_screenwidth() - self.top.winfo_width()) / 2
		yp = (self.top.winfo_screenheight() - self.top.winfo_height()) / 2
		self.top.geometry("%dx%d+%d+%d" % (self.top.winfo_width(), self.top.winfo_height(), xp, yp))

	def create_framesetup(self):
		self.frame_setup = Frame(self.container, width=FORM_WIDTH, height=FORM_HEIGHT)

		# Add some padding to make it look a bit better
		self.frame_setup.columnconfigure(0, pad=11)
		self.frame_setup.columnconfigure(1, weight=1)
		self.frame_setup.rowconfigure(1, pad=8)
		self.frame_setup.rowconfigure(3, weight=1) # Stretch space above button

		l_start = Label(self.frame_setup, text="Start:")
		l_start.grid(row=0, sticky=W)
		e_start = Entry(self.frame_setup, textvariable=self.start)
		e_start.grid(row=0, column=1, sticky="we")

		l_mittag = Label(self.frame_setup, text="Mittag:")
		l_mittag.grid(row=1, sticky=W)
		e_mittag = Entry(self.frame_setup, textvariable=self.mittag)
		e_mittag.grid(row=1, column=1, sticky="we")

		l_mende = Label(self.frame_setup, text="Weiter:")
		l_mende.grid(row=2, sticky=W)
		e_mende = Entry(self.frame_setup, textvariable=self.mende)
		e_mende.grid(row=2, column=1, sticky="we")

		b_run = Button(self.frame_setup, text="Run!", command=self.run_clicked, width=6, default="active")
		b_run.grid(row=4, columnspan=2, ipadx=20)

		# Force frame dimensions to apply
		self.frame_setup.grid_propagate(0)

		# Focus
		e_start.focus_set()

	def create_framecounter(self):
		self.frame_counter = Frame(self.container, width=FORM_WIDTH, height=FORM_HEIGHT)

		# Auto-stretching
		self.frame_counter.columnconfigure(1, weight=1)
		self.frame_counter.rowconfigure(4, weight=1) # Stretch space above button

		l_bisher = Label(self.frame_counter, text="Bisher da:")
		l_bisher.grid(row=0, column=0, sticky=W)
		l_bisher_d = Label(self.frame_counter, textvariable=self.bisher)
		l_bisher_d.grid(row=0, column=1, sticky=E)

		l_nochda = Label(self.frame_counter, text="Heimgehen um:")
		l_nochda.grid(row=1, column=0, sticky=W)
		l_nochda_d = Label(self.frame_counter, textvariable=self.nochda)
		l_nochda_d.grid(row=1, column=1, sticky=E)

		l_countdown = Label(self.frame_counter, text="l_countdown", textvariable=self.countdownlabel)
		l_countdown.grid(row=2, column=0, sticky=W)
		l_countdown_d = Label(self.frame_counter, textvariable=self.countdown)
		l_countdown_d.grid(row=2, column=1, sticky=E)

		l_eur = Label(self.frame_counter, text="Verdient:")
		l_eur.grid(row=3, column=0, sticky=W)
		l_eur_d = Label(self.frame_counter, textvariable=self.eur)
		l_eur_d.grid(row=3, column=1, sticky=E)

		b_setup = Button(self.frame_counter, text="Setup", command=self.setup_clicked, width=6, default="active")
		b_setup.grid(row=5, columnspan=2, ipadx=20)

		# Force frame dimensions to apply
		self.frame_counter.grid_propagate(0)

	def create_widgets(self):
		self.container = Frame(self)
		self.container.columnconfigure(0, weight=1)
		self.container.rowconfigure(0, weight=1)

		# Create the sub frames
		self.create_framesetup()
		self.create_framecounter()

		# Initially show the setup frame
		self.frame_setup.grid(sticky="nwse")

		# Grid the container
		self.container.grid(padx=11, pady=11)

	def return_hit(self):
		if self.run_timer:
			self.setup_clicked()
		else:
			self.run_clicked()

	def run_clicked(self):
		# Get the input
		self.mins_start = str_to_minutes(self.start.get())
		self.mins_mittag = str_to_minutes(self.mittag.get())
		self.mins_mende = str_to_minutes(self.mende.get())

		# Switch frames
		self.frame_setup.grid_remove()
		self.frame_counter.grid(sticky="nwse")

		# Activate timer
		self.run_timer = True
		self.timer_handler()

	def setup_clicked(self):
		# Stop timer
		self.run_timer = False

		# Switch frames
		self.frame_counter.grid_remove()
		self.frame_setup.grid(sticky="nwse")

	def timer_handler(self):
		max_mins = 60 * HOURS_OF_DAY
		nowdate = datetime.datetime.now() 
		nowstr = nowdate.strftime("%H:%M")
		curmins = str_to_minutes(nowstr)

		if self.mins_mittag != -1 and self.mins_mende != -1:
			workedmins = (self.mins_mittag - self.mins_start) + (curmins - self.mins_mende)
		else:
			workedmins = curmins - self.mins_start

		acht_diff = max_mins - workedmins
		acht_end = curmins + acht_diff

		# Money per unit
		mpermin = float(MONEY_PER_HOUR) / 60.0
		mpersec = mpermin / 60.0

		# Total money
		money = (float(workedmins) * mpermin) + (float(nowdate.second) * mpersec)

		self.bisher.set(minutes_to_str(workedmins))
		self.eur.set("€ %04.2f" % money)
		self.nochda.set(minutes_to_str(acht_end))
		self.countdown.set(minutes_to_str(acht_diff))

		# Setup the countdown label
		self.countdownlabel.set("Heimgehen in:" if acht_diff >= 0 else "Überstunden:")

		# Call it again soon if desired
		if self.run_timer:
			self.after(100, self.timer_handler)

# Main program
if len(sys.argv) > 1:
    MONEY_PER_HOUR = int(sys.argv[1])
if len(sys.argv) > 2:
    HOURS_OF_DAY = int(sys.argv[2])
app = Application()
app.master.title("Freelancer")
app.mainloop()
