# tekstklok.py
# 
# MIT-License
#
# Copyright © 2024 Theo van Haandel  py39@x4a.nl
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation
# files (the "Software"), to deal in the Software without
# restriction, including without limitation the rights to use,
# copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following
# conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.

# versie 2.0  2024-12-06
# GUI klok met tijd weergave in spreektaal tekst

import datetime
import random
import sys
import tkinter

getallen = (
    'nul', 'een', 'twee', 'drie', 'vier',
    'vijf', 'zes', 'zeven', 'acht', 'negen',
    'tien', 'elf', 'twaalf', 'dertien', 'veertien',
    )

tientallen = 'twintig', 'dertig', 'veertig', 'vijftig'

dagdelen = (
    'in de nacht', 'in de ochtend',
    'in de middag', 'in de avond' )

def getalTkst(waarde): # 0 tm 59
    if waarde < 15:
        return getallen[waarde]
    if waarde < 20:
        return getallen[waarde-10] + getallen[10]
    tienvoud = waarde // 10
    eenheid = waarde % 10
    if eenheid == 0:
        return tientallen[tienvoud-2]
    en = 'ën' if eenheid == 2 or eenheid == 3 else 'en'
    return getallen[eenheid] + en + tientallen[tienvoud-2]

if 0:
    for getal in range(60):
        print(getal, getalTkst(getal), end='; ')
    sys.exit()

def getalTekst(waarde): # 0 tm 59
    if waarde < 15:
        txt = getallen[waarde],
    elif waarde < 20:
        txt = getallen[waarde - 10], getallen[10]
    else:
        tiental, rest = divmod(waarde - 20, 10)
        if rest:
            en = 'ën' if rest in (2,3) else 'en'
            # en = 'en' # test
            txt = getallen[rest], en, tientallen[tiental]
        else:
            txt = tientallen[tiental],
    return ''.join(txt)

if 0:
    for getal in range(60):
        print(getal, getalTekst(getal), end='; ')
    sys.exit()

if 0:
    print('TestG')
    for getal in range(60):
        gTkst = getalTkst(getal)
        gTekst = getalTekst(getal)
        if gTkst != gTekst:
            print('<!>', getal, gTkst, gTekst)
    sys.exit()

def tijdTkst(dattim):
    uur = dattim.hour
    volgenduur = uur + 1
    minuut = dattim.minute
    if minuut < 16:
        spreekuur = uur
    else:
        spreekuur = volgenduur
    if spreekuur == 0:
        spreekuur = 12
    elif spreekuur > 12:
        spreekuur -= 12
    spreekuur = getalTekst(spreekuur)
    if minuut == 0:
        spreekminuut = ''
        tijd = spreekuur + ' uur'
    else:
        if minuut < 15:
            spreekminuut = getalTekst(minuut) + ' over'
        elif minuut == 15:
            spreekminuut = 'kwart over'
        elif minuut < 30:
            spreekminuut = getalTekst(30 - minuut) + ' voor half'
        elif minuut == 30:
            spreekminuut = 'half'
        elif minuut < 45:
            spreekminuut = getalTekst(minuut - 30) + ' over half'
        elif minuut == 45:
            spreekminuut = 'kwart voor'
        else:
            spreekminuut = getalTekst(60 - minuut) + ' voor'
        tijd = spreekminuut + ' ' + spreekuur
    return tijd

if 0:
    random.seed(10)
    for getal in range(30):
        uur = random.randint(0, 23)
        minuut = random.randint(0, 59)
        # uur, minuut = 20, 0
        dattim = datetime.datetime(2024,12,5,uur,minuut)
        print(f'{dattim.hour}:{dattim.minute:02d}', tijdTkst(dattim))
    sys.exit()

if 0:
    for uur in range(24):
        for minuut in range(0, 60, 27):
            dattim = datetime.datetime(2024,12,5,uur,minuut)
            print(dattim.time(), tijdTkst(dattim), end='; ')
        if 0:
            break
        print()
    sys.exit()

def tijdTekst(dattim):
    uur = dattim.hour
    minuut = dattim.minute
    seconde = dattim.second

    dagdeel = dagdelen[uur // 6]

    # spreekUur 1 tm 12
    spreekUur = uur
    if uur == 0:
        spreekUur = 12
    elif uur > 12:
        spreekUur = uur - 12
    
    # volgendUur 1 tm 12
    volgendUur = spreekUur + 1
    if volgendUur == 13:
        volgendUur = 1

    spreekUur = getalTekst(spreekUur)
    volgendUur = getalTekst(volgendUur)

    uur = 'uur'
    voor = 'voor'
    over = 'over'
    kwart = 'kwart'
    half = 'half'

    if minuut == 0:
        tkst = spreekUur, uur
    elif minuut < 15:
        tkst = getalTekst(minuut), over, spreekUur
    elif minuut == 15:
        tkst = kwart, over, spreekUur
    elif minuut < 30:
        tkst = getalTekst(30 - minuut), voor, half, volgendUur
    elif minuut == 30:
        tkst = half, volgendUur
    elif minuut < 45:
        tkst = getalTekst(minuut - 30), over, half, volgendUur
    elif minuut == 45:
        tkst = kwart, voor, volgendUur
    else:    
        tkst = getalTekst(60 - minuut), voor, volgendUur

    return ' '.join(tkst), getalTekst(seconde), dagdeel

if 0:
    for uur in range(24):
        for minuut in range(0, 60, 27):
            dattim = datetime.datetime(2024,12,5,uur,minuut)
            dt, sec, dd = tijdTekst(dattim)
            print(dattim.time(), dt, end='; ')
        if 0:
            break
        print()
    sys.exit()

if 0:
    print('TestT')
    for uur in range(24):
        for minuut in range(60):
            dattim = datetime.datetime(2024,12,5,uur,minuut)
            tTkst = tijdTkst(dattim)
            tTekst, sec, dd = tijdTekst(dattim)
            if tTkst != tTekst:
                print('<!>', dattim.time(), tTkst, tTekst)
    sys.exit()

def nowText():
    now = datetime.datetime.now()

    # test
    # now = datetime.datetime(2024, 11, 30, 11, 17, 59)

    # digits 12:34:56
    # return f'{now.hour}:{now.minute:02d}:{now.second:02d}'

    progress = '.' if now.second % 2 else ','

    tim, sec, daypart = tijdTekst(now)
    tim = tijdTkst(now)

    # items = tim, sec, daypart, progress
    # items = tim, sec, daypart
    # items = tim, daypart, progress
    # items = tim, daypart
    items = tim,
    # items = tim, progress
    
    return '\n'.join(items)

class TekstClock(tkinter.Tk):
    def __init__(self):
        super().__init__()
        self.title('Tekst Klok')

        self.geometry('600x400')
        self.base = 40
        self.scale = 400

        # self.fontname = ''
        self.fontname = 'Arial'
        # self.fontname = 'Courier'
        # self.fontname = 'Times'

        font = (self.fontname, self.base)
        self.label = tkinter.Label(self, font=font)
        self.label.pack(side='top', fill='both', expand=True)

        self.bind('<Configure>', self.config)
        self.after(0, self.update)

    def config(self, event):
        fontsize = self.base * min(event.width, event.height) // self.scale
        self.label['font'] = (self.fontname, fontsize)

    def update(self):
        txt = nowText()
        # print(repr(txt))
        self.label['text'] = txt
        self.after(200, self.update) # milliseconde

# How can you make Python Tkinter Label text resize automatically along with the root window? - Stack Overflow
# https://stackoverflow.com/questions/72405664/how-can-you-make-python-tkinter-label-text-resize-automatically-along-with-the-r

# class zonder inheritance
# ... todo

if __name__ == '__main__':
    tekstclock = TekstClock()
    tekstclock.mainloop()
