"""
Outputs "dark" when it's dark and "light" when it's light.

Only works on Freedesktop platforms (Linux, *BSD, etc.).

NOTE: This code was stolen from the depths of hell. I give absolutely no warranty for this. I also hate this.
"""
import math
import datetime
import time

import gi
gi.require_version("Geoclue", "2.0")
from gi.repository import Geoclue

RAD = math.pi/180.0
h = -(50.0/60.0)*RAD


def get_user_location():
    clue = Geoclue.Simple.new_sync("", Geoclue.AccuracyLevel.CITY, None)
    location = clue.get_location()
    return location.get_property("latitude"), location.get_property("longitude")


def sonnendeklination(T):
    return 0.40954*math.sin(0.0172*(T-79.35))


def zeitdifferenz(deklination):
    global B
    return 12.0*math.acos((math.sin(h) - math.sin(B)*math.sin(deklination)) / (math.cos(B)*math.cos(deklination)))/math.pi


def zeitgleichung(T):
    return -0.1752*math.sin(0.033430 * T + 0.5474) - 0.1340*math.sin(0.018234*T - 0.1939)

def aufgang1(T):
    DK = sonnendeklination(T)
    return 12 - zeitdifferenz(DK) - zeitgleichung(T)

def untergang1(T):
    DK = sonnendeklination(T)
    return 12 + zeitdifferenz(DK) - zeitgleichung(T)

def get_sun(lat, lon):
    global B
    Laenge = lon
    Breite = lat
    now = datetime.datetime.now()
    Zone = (now - datetime.datetime.utcnow()).seconds / 60**2
    T = now.timetuple().tm_yday
    B = Breite*RAD
    Aufgang = aufgang1(T)
    Untergang = untergang1(T)

    Aufgang = Aufgang - Laenge/15.0 + Zone
    Untergang = Untergang - Laenge/15.0 + Zone

    Aufgangh = math.floor(Aufgang)
    AufgangH = "0" + str(Aufgangh) if Aufgangh < 10 else str(Aufgangh)
    Aufgangm = math.floor(((Aufgang-Aufgangh)*100)*3/5)
    AufgangM = "0" + str(Aufgangm) if Aufgangm < 10 else str(Aufgangm)
    Aufgangs = math.floor(((((((Aufgang-Aufgangh)*100)*3/5)-Aufgangm)*100)*3/5))
    AufgangS = "0" + str(Aufgangs) if Aufgangs < 10 else str(Aufgangs)
    Aufgang = datetime.time.fromisoformat(AufgangH + ":" + AufgangM + ":" + AufgangS)

    Untergangh = math.floor(Untergang)
    UntergangH = "0" + str(Untergangh) if Untergangh < 10 else str(Untergangh)
    Untergangm = math.floor(((Untergang-Untergangh)*100)*3/5)
    UntergangM = "0" + str(Untergangm) if Untergangm < 10 else str(Untergangm)
    Untergangs = math.floor(((((((Untergang-Untergangh)*100)*3/5)-Untergangm)*100)*3/5))
    UntergangS = "0" + str(Untergangs) if Untergangs < 10 else str(Untergangs)
    Untergang = datetime.time.fromisoformat(UntergangH + ":" + UntergangM + ":" + UntergangS)

    return Aufgang, Untergang


def main():
    lat, lon = get_user_location()
    now = datetime.datetime.now().time()
    sunrise, sunset = get_sun(lat, lon)
    print("dark" if now > sunset or now < sunrise else "light")


if __name__ == "__main__":
    main()