"""Gemini 2.5 Flash 요약 생성 모듈"""

import logging
import re
import time
from dataclasses import dataclass
from typing import Optional

import google.generativeai as genai

from . import config

logger = logging.getLogger(__name__)

# 요약 프롬프트 (보험 도메인 특화, 기존 crawlYoutubeChannels.ts와 동일)
YOUTUBE_SUMMARY_PROMPT = """
당신은 보험 콘텐츠 전문 분석가입니다.
아래 보험 유튜브 영상 자막을 꼼꼼히 분석하고 **설계사가 바로 업무에 활용할 수 있도록** 충분히 상세하게 요약해 주세요.

[분석 항목]

## 1. 핵심 요약
영상의 핵심 주제와 결론을 **충분히 담아서** 요약합니다.
짧은 영상이면 간결하게, 긴 영상이면 중요 내용이 빠지지 않도록 길게 작성해도 됩니다.

## 2. 설계사 고객 상담 활용 포인트
고객 상담 시 실제로 쓸 수 있는 포인트를 **내용이 있는 만큼** 추출합니다.
개수 제한 없음 — 중요한 내용이라면 10개, 20개도 괜찮습니다.

## 3. 언급된 보험 상품 / 보험사
영상에서 언급된 특정 상품명, 보험사명, 특약명을 모두 나열합니다. (없으면 "없음")

## 4. 수치 / 금액 정보
보험료, 보험금, 비율 등 수치가 언급된 경우 **자막 원문 그대로** 정리합니다. (없으면 "없음")

## 5. 약관과 다를 수 있는 내용 ⚠️
영상 내용이 일반적인 약관 규정과 다르거나 오해를 살 수 있는 부분을 명시합니다.
(없으면 "없음" — 억지로 찾지 마세요)

## 6. 주제별 섹션 흐름 요약
영상이 어떤 순서로 진행됐는지, 주요 섹션별로 요약합니다.
긴 영상일수록 섹션을 더 세분화해서 작성합니다.

⚠️ 반드시 지켜야 할 규칙:
- 자막에 없는 내용은 절대 추가하지 않습니다
- 보험료·금액 수치는 자막 원문 그대로만 인용합니다
- 불확실한 표현("아마도", "추정" 등) 사용 금지
- 마지막 줄에 반드시 포함: "※ 이 요약은 자동 생성이며 약관 원문을 우선합니다"
"""


@dataclass
class SummaryResult:
    summary_text: str
    has_numeric_warnings: bool  # 수치 포함 여부 (금소법 경고용)


def _init_genai() -> "genai.GenerativeModel":  # type: ignore[name-defined]
    """Gemini API 초기화"""
    genai.configure(api_key=config.GEMINI_API_KEY)  # type: ignore[attr-defined]
    return genai.GenerativeModel(config.GEMINI_MODEL)  # type: ignore[attr-defined]


def generate_summary(transcript_text: str) -> SummaryResult:
    """전사 텍스트로부터 구조화된 요약 생성 (지수 백오프 포함)"""
    model = _init_genai()

    max_retries = 4
    base_delay = 5.0

    prompt = f"{YOUTUBE_SUMMARY_PROMPT}\n\n[자막 내용]\n{transcript_text[:200000]}"

    last_error: Optional[Exception] = None
    for attempt in range(max_retries + 1):
        try:
            response = model.generate_content(prompt)
            summary = response.text

            # 수치 포함 여부 체크 (숫자+단위 패턴)
            has_numeric = bool(
                re.search(r"\d+[\s]*(만원|원|%|퍼센트|세|년|개월|일)", summary)
            )

            return SummaryResult(
                summary_text=summary,
                has_numeric_warnings=has_numeric,
            )
        except Exception as e:
            last_error = e
            if attempt < max_retries:
                delay = base_delay * (2**attempt) + (hash(str(e)) % 1000) / 1000
                logger.warning(
                    "Gemini 오류 (시도 %d/%d), %.1f초 후 재시도: %s",
                    attempt + 1,
                    max_retries,
                    delay,
                    e,
                )
                time.sleep(delay)

    raise RuntimeError(f"Gemini 요약 생성 실패 (최대 재시도 초과): {last_error}")


def generate_embedding(text: str) -> list[float]:
    """텍스트 임베딩 생성 (text-embedding-004, 768차원)"""
    genai.configure(api_key=config.GEMINI_API_KEY)  # type: ignore[attr-defined]
    result = genai.embed_content(  # type: ignore[attr-defined]
        model=f"models/{config.EMBEDDING_MODEL}",
        content=text[:8000],
    )
    return result["embedding"]  # type: ignore[index]
