"""Retrieval cache. The key includes groups, embed version, and corpus version.

A key of the query text alone will serve a manager's chunk to an employee.
Embed version alone still serves a tombstoned chunk after the handbook changes.
Bump corpus_version when you upsert or tombstone.
"""

from __future__ import annotations


class RetrievalCache:
    def __init__(self):
        self._data = {}

    @staticmethod
    def key(query: str, groups, embed_version: str, corpus_version: str):
        if not embed_version or corpus_version is None or corpus_version == "":
            raise ValueError("embed_version and corpus_version required")
        return (query, tuple(sorted(groups)), embed_version, str(corpus_version))

    def get(self, query, groups, embed_version, corpus_version):
        return self._data.get(self.key(query, groups, embed_version, corpus_version))

    def put(self, query, groups, embed_version, corpus_version, value):
        self._data[self.key(query, groups, embed_version, corpus_version)] = value
        return value
