"""
書籍キーワードの品質フィルタリングモジュール

不適切なキーワード（書籍形式、販売情報、年号など）を除外し、
書籍の内容を表す高品質なキーワードのみを保持します。
"""
import re
from typing import List


class KeywordFilter:
    """書籍キーワードの品質フィルタリングクラス"""

    # 完全一致NGワード（確実に除外すべきキーワード）
    EXACT_BLOCK_WORDS = {
        # 書籍形式
        '本', '上巻', '下巻', 'セット', '完全版', '全巻', '巻', '第1巻',
        # 物理要素
        '表紙', 'カバー', 'ページ', '紙',
        # 販売状態
        '予約', '入荷予約', '限定', '限定特典', '特典', '楽天ブックス',
        # 一般語（内容を表さない）
        'もの', 'こと', '記録', '知識',
    }

    # パターンブロック（正規表現マッチ）
    PATTERN_BLOCKS = [
        r'^\d{4}$',          # 4桁年号: 2025, 2026
        r'^第?\d+[巻号]?$',  # 巻号: 第1巻, 1巻, 第1号, 21
        r'.*限定.*',         # 限定を含む
        r'.*予約.*',         # 予約を含む
        r'.*ブックス.*',     # 書店名
        r'^\d+$',            # 純粋な数字のみ
    ]

    def filter(self, keywords: List[str], title: str = "") -> List[str]:
        """
        キーワードリストをフィルタリングします。

        Args:
            keywords (List[str]): フィルタリング対象のキーワードリスト
            title (str): 書籍タイトル（将来の拡張用）

        Returns:
            List[str]: フィルタリング後のキーワードリスト
        """
        filtered = []

        for keyword in keywords:
            keyword = keyword.strip()

            # 空文字チェック
            if not keyword:
                continue

            # 1文字キーワード除外（短すぎて意味が不明確）
            if len(keyword) == 1:
                continue

            # 完全一致NGワード
            if keyword in self.EXACT_BLOCK_WORDS:
                continue

            # パターンマッチチェック
            if self._matches_block_pattern(keyword):
                continue

            filtered.append(keyword)

        return filtered

    def _matches_block_pattern(self, keyword: str) -> bool:
        """
        キーワードがブロックパターンに一致するかチェックします。

        Args:
            keyword (str): チェック対象のキーワード

        Returns:
            bool: パターンに一致する場合True
        """
        for pattern in self.PATTERN_BLOCKS:
            if re.match(pattern, keyword):
                return True
        return False