"""Module for caching ZoneInfos."""

from __future__ import annotations

import asyncio
from zoneinfo import ZoneInfo


class CachedZoneInfo(ZoneInfo):
    """Cache ZoneInfo objects."""

    _cache: dict[str, ZoneInfo] = {}

    @classmethod
    async def get_cached_zone_info(cls, time_zone_str: str) -> ZoneInfo:
        """Get a cached zone info object."""
        if cached := cls._cache.get(time_zone_str):
            return cached
        loop = asyncio.get_running_loop()
        zinfo = await loop.run_in_executor(None, _get_zone_info, time_zone_str)
        cls._cache[time_zone_str] = zinfo
        return zinfo


def _get_zone_info(time_zone_str: str) -> ZoneInfo:
    """Get a time zone object for the given time zone string."""
    return ZoneInfo(time_zone_str)