from typing import Optional
from olc.bean.match_wrapper import MatchWrapper
from olc.utils.empty_checker import EmptyChecker


class OlcControlResult:
    def __init__(
        self,
        block: bool = False,
        block_msg: str = "",
        block_rule: Optional['MatchWrapper'] = None,
    ):
        self.block = block
        self.block_msg = block_msg
        self.block_rule = block_rule
        # 对应response_quota 响应体流控使用,再次扣除令牌数目多退少补 可为负数, 负数表示补充
        self.tokens_to_deduct = 0
    
    def __repr__(self):
        return (
            f"OlcControlResult(block = {self.block}, "
            f"block_mgs = {self.block_msg}, "
            f"block_rule = {self.block_rule}, "
            f"tokens_to_deduct = {self.tokens_to_deduct})"
        )
    
    def __str__(self):
        return self.__repr__()

    def set_rule_and_message(self, match_wrapper: MatchWrapper):
        self.block_rule = match_wrapper
        msg = match_wrapper.policy.block_msg
        if EmptyChecker.is_empty_string(msg):
            msg = "block by olc"
        self.block_msg = msg

    def set_tokens_to_deduct(self, size: int):
        self.tokens_to_deduct = size