import threading
from datetime import timedelta

from requests_cache import CachedSession

from core.data_store import CACHE_DIR


class URLDataCache(CachedSession):
    """Cache for "semi-static" data retrieved from a URL. This is an extra layer of caching in addition to the normal
    caching of spots, alerts and other data in the DataStore class. Its purpose is to avoid hitting remote endpoints
    frequently when e.g. restarting Spothole many times during testing. It should only be used for data that isn't
    expected to change on a sub-daily basis, so never for spots & alerts. It also implements a lock to allow it to be
    used across multiple threads, though note that URL lookups will block each other this way, so it is still better to
    create one of these objects per thread if possible."""

    _lock = threading.Lock()

    def __init__(self, name):
        super().__init__(CACHE_DIR + "urls/" + name, expire_after=timedelta(days=1),
                         allowable_codes=(200, 400, 401, 403, 404))

    def get(self, *args, **kwargs):
        with self._lock:
            return super().get(*args, **kwargs)