import re
import jieba
from collections import Counter
from transformers import pipeline

class ProductOptionTranslator:
    def __init__(self, product_name, options, translator):
        """
        옵션 명칭을 간소화하고 번역하는 클래스.

        Parameters:
        - product_name (str): 상품명
        - options (list): 옵션명 리스트 (중국어 원문)
        - translator (object): 번역기 객체 (예: transformers의 pipeline 등)
        """
        self.product_name = product_name
        self.options = options
        self.translator = translator

    def simplify_options(self):
        """
        각 옵션의 특징을 간결하게 남기고 불필요한 정보를 제거합니다.

        Returns:
        - simplified_options (list): 간소화된 옵션명 리스트
        """
        # 상품명에서 공통적인 키워드 추출
        common_words = self.extract_common_words()
        simplified_options = []

        for option in self.options:
            # 형태소 분석을 통해 단어 단위로 분리
            words = list(jieba.cut(option))
            
            # 의미 있는 단어만 남기기 (숫자, 영어, 특수한 패턴 유지)
            keywords = [word for word in words if self.is_significant(word, common_words)]
            
            # 간결하게 옵션명 재구성
            simplified_option = " ".join(keywords)
            simplified_options.append(simplified_option)

        return simplified_options

    def extract_common_words(self):
        """
        상품명에서 공통적으로 사용되는 키워드를 추출합니다.

        Returns:
        - common_words (set): 상품명에서 중복되는 일반적인 단어들의 집합
        """
        product_words = list(jieba.cut(self.product_name))
        word_counts = Counter(product_words)
        common_words = {word for word, count in word_counts.items() if count > 1}
        return common_words

    def is_significant(self, word, common_words):
        """
        단어가 의미 있는지 확인합니다. 의미 없는 수식어나 중복된 단어는 제거합니다.

        Parameters:
        - word (str): 검사할 단어
        - common_words (set): 상품명에서 추출한 공통 단어들

        Returns:
        - (bool): 단어가 의미 있는 경우 True, 그렇지 않은 경우 False
        """
        # 공통 단어 또는 의미 없는 수식어는 제거
        if word in common_words:
            return False
        # 숫자, 영어 또는 특정 패턴(전압, 전류 등)은 의미 있는 단어로 간주
        if re.match(r'[A-Za-z0-9]+', word) or re.match(r'\d+(V|A|W|Hz)', word):
            return True
        return True if len(word) > 1 else False

    def translate_options(self, simplified_options):
        """
        간소화된 옵션명을 한글로 번역합니다.

        Parameters:
        - simplified_options (list): 간소화된 옵션명 리스트

        Returns:
        - translated_options (list): 한글로 번역된 옵션명 리스트 (25자 이내로 축약)
        """
        translated_options = []
        for option in simplified_options:
            translated_text = self.translator(option, src_lang="zh", tgt_lang="ko")
            # 번역된 결과가 25자를 넘을 경우 축약
            if len(translated_text) > 25:
                translated_text = translated_text[:25] + '...'
            translated_options.append(translated_text)
        return translated_options

    def process_options(self):
        """
        전체 옵션 처리 과정을 수행합니다 (간소화 + 번역).

        Returns:
        - translated_options (list): 최종 한글로 번역된 옵션 리스트
        """
        simplified_options = self.simplify_options()
        return self.translate_options(simplified_options)


# 번역기 예시 (transformers의 pipeline을 사용한 경우)
translator = pipeline('translation', model='Helsinki-NLP/opus-mt-zh-ko')

# 예제 데이터
product_name = "전기 드릴 18V 가정용"
options = ["18V 2.0Ah 배터리 포함", "18V 본체만", "충전기 포함 세트", "전용 케이스"]

# 클래스 사용
translator_class = ProductOptionTranslator(product_name, options, translator)
translated_options = translator_class.process_options()

for idx, translated_option in enumerate(translated_options, 1):
    print(f"옵션 {idx}: {translated_option}")