import re


class DictChecker:
    def __init__(self, object_dict: dict) -> None:
        self.__object_dict = object_dict

    def is_empty(self, check_key):
        """辞書型バリュー空文字チェック"""
        return self.__object_dict[check_key] == '' or self.__object_dict[check_key] is None

    def is_list_empty(self, check_key):
        """list型データ存在チェック"""
        return len(self.__object_dict[check_key]) == 0

    def check_key_exist(self, check_key: str) -> bool:
        """辞書型キー存在チェック"""
        return check_key in self.__object_dict and not self.is_empty(check_key)

    def check_data_type(self, check_key: str, check_type: type) -> bool:
        """辞書型バリュー型チェック"""
        return isinstance(self.__object_dict[check_key], check_type)

    def check_match_pattern(self, regex_str: str, check_key: str) -> bool:
        """辞書型バリュー正規表現チェック"""
        return True if re.fullmatch(regex_str, self.__object_dict[check_key]) else False

    def assert_key_exist(self, check_key: str) -> None:
        """辞書型キー存在検査"""
        if not self.check_key_exist(check_key):
            raise Exception(f'「{check_key}」キーは必須です')

        return

    def assert_data_type(self, check_key: str, check_type: type) -> None:
        """バリュー型検査"""
        if not self.check_data_type(check_key, check_type):
            raise Exception(f'「{check_key}」キーの値は「{check_type}」でなければなりません')

        return

    def assert_match_pattern(self, check_key: str, regex_str: str, expected_str: str):
        """正規表現検査"""
        if not self.check_match_pattern(regex_str, check_key):
            raise Exception(f'「{check_key}」キーの値の正規表現チェックに失敗しました 「{expected_str}」形式である必要があります')

        return

    def assert_list_empty(self, check_key: str):
        if self.is_list_empty(check_key):
            raise Exception(f'「{check_key}」キーのリストの値は必須です')
