from email.mime import message
import os
import json
import re
import logging
import unicodedata
from datetime import datetime
from typing import List, Dict, Set, Tuple
from dataclasses import dataclass
import random

@dataclass
class EmojiPattern:
    emoji: str
    category: str
    responses: List[str]   # ✅ 단일 응답 → 복수 응답 리스트로 확장
    enabled: bool = True

# ===============================
# EmojiResponseManager
# ===============================
class EmojiResponseManager:
    """이모티콘 응답을 관리하는 클래스"""

    def __init__(self, config_file: str = None):
        self.emoji_patterns: List[EmojiPattern] = []
        self.config_file = config_file or './config/emoji_patterns.json'    #추후 JSON 기반 커스터마이징 가능.
        self._load_default_patterns()
        self._load_from_config()
    
    def _load_default_patterns(self):
        """기본 이모티콘 패턴 로드"""
        emoji_patterns = [
            # 긍정적 감정
            EmojiPattern('👍', 'positive', ['좋은 의견이네요! 😊 MLink에 대해 궁금한 점이 있으시면 언제든 물어보세요.'], True),
            EmojiPattern('👎', 'negative', ['아쉬운 부분이 있으신가요? 😔 어떤 점이 불편하셨는지 알려주시면 도움을 드릴게요.'], True),
            EmojiPattern('😊', 'positive', ['기분이 좋으시군요! 😄 오늘도 MLink와 함께 즐거운 하루 보내세요!'], True),
            EmojiPattern('😍', 'positive', ['정말 마음에 드시나 봐요! 💕 MLink의 어떤 기능이 가장 인상적이었나요?'], True),
            EmojiPattern('😄', 'positive', ['웃음이 가득하네요! 😊 MLink 사용하시면서 즐거운 경험이 있으셨나요?'], True),
            EmojiPattern('🤣', 'positive', ['정말 재미있으신가봐요! 😆 혹시 MLink 관련해서 궁금한 점이 있으시면 말씀해 주세요.'], True),
            EmojiPattern('😉', 'positive', ['윙크까지! 😄 MLink에 대해 무엇이든 물어보세요!'], True),
            EmojiPattern('😅', 'neutral', ['조금 어색하신가요? 😊 천천히 MLink 기능들을 알아가시면 됩니다!'], True),
            EmojiPattern('😂', 'positive', ['웃음이 터지셨나요? 😄 즐거운 마음으로 MLink를 사용해 보세요!'], True),
            EmojiPattern('🙃', 'positive', ['장난스러우시네요! 😊 MLink에 대한 질문이나 궁금한 점이 있으시면 언제든 말씀해 주세요.'], True),
            EmojiPattern('😀', 'positive', ['밝은 미소네요! 😊 오늘 MLink로 무엇을 도와드릴까요?'], True),
            EmojiPattern('😁', 'positive', ['환한 웃음이군요! 😄 MLink 사용하시면서 도움이 필요한 부분이 있으시면 말씀해 주세요.'], True),
            EmojiPattern('🤔', 'neutral', ['무언가 고민중이신가요? 🤗 MLink 관련해서 궁금한 점이 있으시면 도움을 드릴게요!'], True),
            EmojiPattern('😮', 'neutral', ['놀라셨나요? 😲 MLink의 새로운 기능을 발견하셨나요?'], True),
            EmojiPattern('🤨', 'neutral', ['의심스러운 표정이시네요? 🧐 MLink에 대해 확인하고 싶은 내용이 있으시면 말씀해 주세요!'], True),
            EmojiPattern('😇', 'positive', ['천사 같은 미소네요! 😇 MLink 사용에 대해 궁금한 점이 있으시면 언제든 물어보세요!'], True),
            # 부정적 감정
            EmojiPattern('😢', 'negative', ['속상하신 일이 있으셨나요? 😔 MLink 사용에 어려움이 있으시면 차근차근 도와드릴게요.'], True),
            EmojiPattern('😞', 'negative', ['기분이 안 좋으신 것 같아요. 😟 MLink 관련해서 문제가 있으시면 해결해 드릴게요!'], True),
            EmojiPattern('😐', 'neutral', ['무표정이시네요. 😅 MLink에 대해 특별히 궁금한 점이 있으신가요?'], True),
            EmojiPattern('😠', 'negative', ['화가 나셨나요? 😰 MLink 사용에 불편함이 있으셨다면 개선할 수 있도록 도와드릴게요!'], True),
            EmojiPattern('😤', 'negative', ['답답하신가 봐요! 😮‍💨 어떤 부분에서 어려움을 겪고 계신지 말씀해 주세요.'], True),
            EmojiPattern('😭', 'negative', ['많이 속상하신가 봐요. 😢 MLink 사용에 어려움이 있으시면 언제든지 도와드릴게요!'], True),
            # 동물 이모티콘
            EmojiPattern('🐶', 'animal', ['귀여운 강아지네요! 🐕 MLink도 충실한 파트너가 되어드릴게요!'], True),
            EmojiPattern('🐱', 'animal', ['고양이를 좋아하시나요? 😸 MLink도 고양이처럼 유연하고 편리한 서비스입니다!'], True),
            # 음식 이모티콘
            EmojiPattern('🍎', 'food', ['사과 좋아하시나요? 🍏 MLink도 신선하고 건강한 비즈니스 솔루션을 제공합니다!'], True),
            EmojiPattern('🍕', 'food', ['피자 드시고 계신가요? 🍽️ MLink로 맛있는 성과를 만들어보세요!'], True),
            EmojiPattern('☕', 'food', ['커피 한 잔 하시면서 MLink와 함께 생산성을 높여보세요! ☕'], True),
            # 하트 이모티콘
            EmojiPattern('❤️', 'love', ['사랑을 표현해 주셨네요! 💕 MLink도 고객님을 위해 최선을 다하겠습니다!'], True),
            EmojiPattern('💕', 'love', ['다정한 마음 감사해요! 🥰 MLink 사용에 대해 무엇이든 물어보세요!'], True),
            EmojiPattern('💖', 'love', ['반짝이는 마음이네요! ✨ MLink와 함께 빛나는 비즈니스를 만들어보세요!'], True),
            EmojiPattern('💙', 'love', ['푸른 하트가 멋지네요! 💙 MLink도 신뢰할 수 있는 파트너가 되어드릴게요!'], True),
            # 박수 이모티콘
            EmojiPattern('👏', 'celebration', ['박수를 쳐주시네요! 🎉 MLink의 어떤 부분이 인상적이었나요?'], True),
            EmojiPattern('🙌', 'celebration', ['만세를 부르시는군요! 🎊 MLink로 성공적인 결과를 얻으셨나요?'], True),
            EmojiPattern('🤝', 'celebration', ['함께하는 마음이 느껴지네요! 🤗 MLink와 함께 더 큰 성과를 만들어보세요!'], True),
            # 기타
            EmojiPattern('🔥', 'enthusiasm', ['열정이 넘치시네요! 🚀 MLink로 뜨거운 성과를 만들어보세요!'], True),
            EmojiPattern('⭐', 'achievement', ['별처럼 빛나시네요! ✨ MLink도 여러분의 비즈니스를 빛나게 도워드릴게요!'], True),
            EmojiPattern('🎉', 'celebration', ['축하 기분이신가요? 🎊 MLink와 함께 더 많은 성취를 이뤄보세요!'], True),
            EmojiPattern('💯', 'achievement', ['완벽하시네요! 👌 MLink도 100% 만족스러운 서비스를 제공하겠습니다!'], True)
        ]
        
        self.emoji_patterns.extend(emoji_patterns)
        logging.info(f'기본 이모티콘 패턴 로드 완료: {len(emoji_patterns)}개')
    
    def _load_from_config(self):
        """설정 파일에서 패턴 로드"""
        if not os.path.exists(self.config_file):
            self._save_to_config()
            return

        try:
            with open(self.config_file, 'r', encoding='utf-8') as f:
                config_data = json.load(f)

            for emoji_data in config_data.get('emoji_patterns', []):
                pattern = EmojiPattern(
                    emoji=emoji_data['emoji'],
                    category=emoji_data['category'],
                    responses=emoji_data['responses'],
                    enabled=emoji_data.get('enabled', True)
                )
                if not any(p.emoji == pattern.emoji for p in self.emoji_patterns):
                    self.emoji_patterns.append(pattern)
                    logging.info(f"설정 파일에서 이모티콘 패턴 로드: {pattern.emoji}")

        except Exception as e:
            logging.warning(f"이모티콘 패턴 설정 파일 로드 실패: {e}")

    def _save_to_config(self):
        """현재 패턴을 설정 파일에 저장"""
        try:
            os.makedirs(os.path.dirname(self.config_file), exist_ok=True)
            config_data = {
                'emoji_patterns': [
                    {
                        'emoji': p.emoji,
                        'category': p.category,
                        'responses': p.responses,
                        'enabled': p.enabled
                    }
                    for p in self.emoji_patterns
                ],
                'last_updated': datetime.now().isoformat()
            }

            with open(self.config_file, 'w', encoding='utf-8') as f:
                json.dump(config_data, f, ensure_ascii=False, indent=2)

            logging.info(f"이모티콘 패턴 설정 저장 완료: {self.config_file}")
        except Exception as e:
            logging.error(f"이모티콘 패턴 설정 파일 저장 실패: {e}")

    def is_emoji_only_message(self, text: str) -> bool:
        """문자열이 이모티콘(emoji)만으로 구성되어 있는지 확인"""
        if not text.strip():
            return False
        clean_text = text.replace(" ", "")
        return all(unicodedata.category(ch).startswith("So") for ch in clean_text)

    def handle_emoji_message(self, message: str) -> dict:
        """이모티콘 전용 메시지 처리 (복수 이모티콘 지원)"""
        responses = []
        emojis = []
        for ch in message.strip():
            if unicodedata.category(ch).startswith("So"):
                emojis.append(ch)
                for pattern in self.emoji_patterns:
                    if pattern.enabled and ch == pattern.emoji:
                        responses.append(random.choice(pattern.responses))
                        break

        if not responses:
            return {
                "final_answer": "이모티콘을 인식하지 못했습니다.",
                "emojis": [],
                "original_paragraphs_open": [],
                "original_paragraphs_collapsed": [],
                "collapsed_label": "",
                "expanded_label": "",
                "references": "",
                "reference_label": "",
                "reference_hide_label": ""
            }

        return {
            "final_answer": " ".join(responses),
            "emojis": emojis,  # 프론트에 넘겨주는 구조적 필드
            "original_paragraphs_open": [],
            "original_paragraphs_collapsed": [],
            "collapsed_label": "",
            "expanded_label": "",
            "references": "",
            "reference_label": "",
            "reference_hide_label": ""
        }

    def get_statistics(self) -> Dict:
        """패턴 통계"""
        category_stats = {}
        for pattern in self.emoji_patterns:
            if pattern.enabled:
                category_stats[pattern.category] = category_stats.get(pattern.category, 0) + 1

        return {
            'total_patterns': len(self.emoji_patterns),
            'enabled_patterns': len([p for p in self.emoji_patterns if p.enabled]),
            'categories': category_stats,
            'last_updated': datetime.now().isoformat()
        }

# ===============================
# 싱글톤 인스턴스 + 편의 함수
# ===============================
_emoji_manager_instance: EmojiResponseManager = None

def _get_instance() -> EmojiResponseManager:
    global _emoji_manager_instance
    if _emoji_manager_instance is None:
        _emoji_manager_instance = EmojiResponseManager()
    return _emoji_manager_instance

def is_emoji_only_message(text: str) -> bool:
    return _get_instance().is_emoji_only_message(text)

def handle_emoji_message(message: str) -> dict:
    return _get_instance().handle_emoji_message(message)

