import logging
import random
import time

logger = logging.getLogger(__name__)


def check_lock(check_lock_period: int, lock_file, jitter: bool = False):
    try:
        return _check_lock(check_lock_period, lock_file, jitter)
    except OSError as exc:
        # returning 0 would make the caller's loop spin
        logger.warning("Cannot update lock file %s: %s", lock_file, exc)
        return check_lock_period


def _check_lock(check_lock_period, lock_file, jitter):
    if not lock_file.exists():
        lock_file.parent.mkdir(parents=True, exist_ok=True)
        if jitter:
            delay = random.randrange(int(check_lock_period))
            if delay > 0:
                lock_file.write_text(str(time.time() + delay))
                return delay
        lock_file.write_text(str(time.time() + check_lock_period))
        return 0

    if (time_left := is_period_passed(check_lock_period, lock_file)) <= 0:
        lock_file.write_text(str(time.time() + check_lock_period))
        return 0
    else:
        return time_left


def is_period_passed(period, lock_file):
    try:
        when_to_run = float(lock_file.read_text())
    except (FileNotFoundError, ValueError):
        return 0
    return when_to_run - time.time()
