from typing import Optional, List
from szurubooru.search.typing import SaQuery


class BaseCriterion:
    def __init__(self, original_text: str) -> None:
        self.original_text = original_text

    def __repr__(self) -> str:
        return self.original_text


class RangedCriterion(BaseCriterion):
    def __init__(
            self,
            original_text: str,
            min_value: Optional[str],
            max_value: Optional[str]) -> None:
        super().__init__(original_text)
        self.min_value = min_value
        self.max_value = max_value

    def __hash__(self) -> int:
        return hash(('range', self.min_value, self.max_value))


class PlainCriterion(BaseCriterion):
    def __init__(self, original_text: str, value: str) -> None:
        super().__init__(original_text)
        self.value = value

    def __hash__(self) -> int:
        return hash(self.value)


class ArrayCriterion(BaseCriterion):
    def __init__(self, original_text: str, values: List[str]) -> None:
        super().__init__(original_text)
        self.values = values

    def __hash__(self) -> int:
        return hash(tuple(['array'] + self.values))
