def _before(
    datetime: UTCDateTime,
    event_function: Callable,
    location: LatLong = LatLong(0, 0)) -> UTCDateTime:
    if (event_function(datetime.year, location) - datetime).days < 0:
        return event_function(datetime.year, location)
    else:
        return event_function(datetime.year - 1, location)
def _after(
    datetime: UTCDateTime,
    event_function: Callable,
    location: LatLong = LatLong(0, 0)) -> UTCDateTime:
    if (event_function(datetime.year, location) - datetime).days >= 0:
        return event_function(datetime.year, location)
    else:
        return event_function(datetime.year + 1, location)
def march_equinox(year: int, location: LatLong = LatLong(0, 0)) -> UTCDateTime:
    return year_data(year).march_equinox
def winter_solstice_before(
    datetime: UTCDateTime, location: LatLong = LatLong(0, 0)) -> UTCDateTime:
    return _before(datetime, winter_solstice, location)
def fall_equinox_before(
    datetime: UTCDateTime, location: LatLong = LatLong(0, 0)) -> UTCDateTime:
    return _before(datetime, fall_equinox, location)
def summer_solstice_after(
    datetime: UTCDateTime, location: LatLong = LatLong(0, 0)) -> UTCDateTime:
    return _after(datetime, summer_solstice, location)
def spring_equinox_after(
    datetime: UTCDateTime, location: LatLong = LatLong(0, 0)) -> UTCDateTime:
    return _after(datetime, spring_equinox, location)
        self._calendar_properties = calendar_properties
        self._current_time = GardenDateTime(location, current_timestamp(),
                                            calendar_properties)
        self._year_start = self._current_time.year_start

    @property
    def current_time(self) -> GardenDateTime:
        if self._current_time is None:
            self._current_time = GardenDateTime(self.location,
                                                current_timestamp(),
                                                self._calendar_properties,
                                                _year_start=self._year_start)
            return self._current_time
        else:
            self._current_time.refresh()
            return self._current_time

    def run(self, refresh_time: float) -> None:
        print()
        while True:
            print(f'\r{self.current_time}', end='')
            sleep(refresh_time)


if __name__ == '__main__':
    calendar_properties = CalendarProperties('DS', es.december_solstice_before,
                                             0)
    print(calendar_properties)
    garden_clock = GardenClock(LatLong(34, -85), calendar_properties)
    garden_clock.run(0.432)
def december_solstice(
    year: int, location: LatLong = LatLong(0, 0)) -> UTCDateTime:
    return year_data(year).december_solstice
def winter_solstice(
    year: int, location: LatLong = LatLong(0, 0)) -> UTCDateTime:
    if location.lat >= 0:
        return december_solstice(year)
    else:
        return june_solstice(year)
def test_LatLong_init_long(init_long, after_long):
    assert LatLong(0, init_long).long == after_long
def test_LatLong_init_lat(init_lat, after_lat):
    assert LatLong(init_lat, 0).lat == after_lat
        cp = CalendarProperties('FE-', es.fall_equinox_after, day_start_offset)
        clocks.append(GardenDateTime(self.location, current_timestamp(), cp))
        cp = CalendarProperties('WS-', es.winter_solstice_after, day_start_offset)
        clocks.append(GardenDateTime(self.location, current_timestamp(), cp))
        self.clocks = clocks

    def refresh_clocks(self) -> None:
        for clock in self.clocks:
            clock.refresh()
        self.clocks.sort()


    def run(self, refresh_time: float = 1) -> None:
        while True:
            self.refresh_clocks()
            for clock in self.clocks:
                print(f'{clock}')
            sleep(refresh_time)
            print('\033[F' * len(self.clocks), end='')



if __name__ == '__main__':
    from datetime import timezone, timedelta, datetime
    now = datetime.now(tz=timezone(timedelta(hours=-4)))
    partial_day = now.hour/24 + now.minute/(24*60) + now.second/(24*60*60)
    location = LatLong(34, -60)
    AllGardenClocks(location, -0.25).run(0.432)


def june_solstice(year: int, location: LatLong = LatLong(0, 0)) -> UTCDateTime:
    return year_data(year).june_solstice
def march_equinox_after(
    datetime: UTCDateTime, location: LatLong = LatLong(0, 0)) -> UTCDateTime:
    return _after(datetime, march_equinox, location)
def september_equinox(
    year: int, location: LatLong = LatLong(0, 0)) -> UTCDateTime:
    return year_data(year).september_equinox
def september_equinox_before(
    datetime: UTCDateTime, location: LatLong = LatLong(0, 0)) -> UTCDateTime:
    return _before(datetime, september_equinox, location)
def spring_equinox(
    year: int, location: LatLong = LatLong(0, 0)) -> UTCDateTime:
    if location.lat >= 0:
        return march_equinox(year)
    else:
        return september_equinox(year)
import pytest

from garden_calendar_time.utcdatetime import UTCDateTime
from garden_calendar_time.utcdatetime import UTCTime

from garden_calendar_time.location import LatLong
import garden_calendar_time.equinox_solstice as es

LOC1 = LatLong(45, 45)
LOC2 = LatLong(-45, -45)

location_data = [LOC1, LOC2]

YEAR1 = es.YearEquinoxSolsticData(2000,
                                  UTCDateTime(2000, 3, 20, 7, 35),
                                  UTCDateTime(2000, 6, 21, 1, 47),
                                  UTCDateTime(2000, 9, 22, 17, 27),
                                  UTCDateTime(2000, 12, 21, 13, 37))

YEAR2 = es.YearEquinoxSolsticData(2001,
                                  UTCDateTime(2001, 3, 20, 13, 30),
                                  UTCDateTime(2001, 6, 21, 7, 37),
                                  UTCDateTime(2001, 9, 22, 23, 4),
                                  UTCDateTime(2001, 12, 21, 19, 21))


YEAR3 = es.YearEquinoxSolsticData(2002,
                                  UTCDateTime(2002, 3, 20, 19, 16),
                                  UTCDateTime(2002, 6, 21, 13, 24),
                                  UTCDateTime(2002, 9, 23, 4, 55),
                                  UTCDateTime(2002, 12, 22, 1, 14))