"""Platform agnostic time implementation"""

from adafruit_blinka import agnostic

# We intentionally are patching into this namespace so skip the wildcard check.
# pylint: disable=unused-wildcard-import,wildcard-import

if agnostic.implementation == "circuitpython":
    from time import *
elif agnostic.implementation == "micropython":
    import utime
    from utime import sleep

    from ucollections import namedtuple

    _struct_time = namedtuple(
        "struct_time",
        (
            "tm_year",
            "tm_mon",
            "tm_mday",
            "tm_hour",
            "tm_min",
            "tm_sec",
            "tm_wday",
            "tm_yday",
            "tm_isdst",
        ),
    )

    # pylint: disable=too-many-arguments
    def _marshal_time(
        tm_year,
        tm_mon,
        tm_mday,
        tm_hour=0,
        tm_min=0,
        tm_sec=0,
        tm_wday=-1,
        tm_yday=-1,
        tm_isdst=-1,
    ):
        """Construct struct_time with default values."""
        _struct_time(
            tm_year,
            tm_mon,
            tm_mday,
            tm_hour,
            tm_min,
            tm_sec,
            tm_wday,
            tm_yday,
            tm_isdst,
        )

    def struct_time(time_tuple):
        """Create a struct_time"""
        return _marshal_time(*time_tuple)

    # pylint: disable=invalid-name
    _total_ms = 0
    _prev_ticks_ms = utime.ticks_ms()

    def monotonic():
        """A monotonically increasing time in seconds. No defined start time."""
        # Assumes that monotonic is called more frequently than the wraparound of micropython's
        # utime.ticks_ms()
        global _prev_ticks_ms, _total_ms  # pylint: disable=global-statement
        ticks_ms = utime.ticks_ms()
        _total_ms += utime.ticks_diff(ticks_ms, _prev_ticks_ms)
        _prev_ticks_ms = ticks_ms
        return _total_ms * 0.001
