"""
나프록센(Naproxen) vs 다른 NSAID 비교 연구
- 심혈관 안전성
- 진통/소염 효과
- 위장관 안전성
- 약국 업셀링 데이터
"""

import sys
import os

# UTF-8 인코딩 강제
if sys.platform == 'win32':
    import io
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
    sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')

from Bio import Entrez
from dotenv import load_dotenv

load_dotenv()

Entrez.email = os.getenv('PUBMED_EMAIL', 'test@example.com')
api_key = os.getenv('PUBMED_API_KEY')
if api_key:
    Entrez.api_key = api_key


def search_naproxen_cardiovascular_safety(max_results=5):
    """나프록센 심혈관 안전성 논문 검색"""

    query = "naproxen cardiovascular safety NSAIDs comparison"

    try:
        print("=" * 80)
        print("검색 1: 나프록센 심혈관 안전성")
        print("=" * 80)
        print(f"검색어: '{query}'")
        print("-" * 80)

        handle = Entrez.esearch(
            db="pubmed",
            term=query,
            retmax=max_results,
            sort="relevance"
        )
        record = Entrez.read(handle)
        handle.close()

        pmids = record["IdList"]
        total_count = int(record["Count"])

        if not pmids:
            print("[WARNING] 검색 결과 없음")
            return []

        print(f"[OK] 총 {total_count}건 검색됨, 상위 {len(pmids)}건 조회 중...\n")

        handle = Entrez.efetch(
            db="pubmed",
            id=pmids,
            rettype="medline",
            retmode="xml"
        )
        papers = Entrez.read(handle)
        handle.close()

        results = []

        for idx, paper in enumerate(papers['PubmedArticle'], 1):
            try:
                article = paper['MedlineCitation']['Article']
                pmid = str(paper['MedlineCitation']['PMID'])
                title = article.get('ArticleTitle', '(제목 없음)')

                # 초록
                abstract_parts = article.get('Abstract', {}).get('AbstractText', [])
                full_abstract = ""

                if abstract_parts:
                    if isinstance(abstract_parts, list):
                        for part in abstract_parts:
                            if hasattr(part, 'attributes') and 'Label' in part.attributes:
                                label = part.attributes['Label']
                                full_abstract += f"\n\n**{label}**\n{str(part)}"
                            else:
                                full_abstract += f"\n{str(part)}"
                    else:
                        full_abstract = str(abstract_parts)
                else:
                    full_abstract = "(초록 없음)"

                # 저널
                journal = article.get('Journal', {}).get('Title', '(저널 없음)')

                # 출판 연도
                pub_date = article.get('Journal', {}).get('JournalIssue', {}).get('PubDate', {})
                year = pub_date.get('Year', '(연도 없음)')

                # 저자
                authors = article.get('AuthorList', [])
                if authors:
                    first_author = authors[0]
                    last_name = first_author.get('LastName', '')
                    initials = first_author.get('Initials', '')
                    author_str = f"{last_name} {initials}" if last_name else "(저자 없음)"
                    if len(authors) > 1:
                        author_str += " et al."
                else:
                    author_str = "(저자 없음)"

                result = {
                    'pmid': pmid,
                    'title': title,
                    'abstract': full_abstract.strip(),
                    'journal': journal,
                    'year': year,
                    'author': author_str
                }

                results.append(result)

                print(f"[{idx}] PMID: {pmid}")
                print(f"제목: {title}")
                print(f"저자: {author_str}")
                print(f"저널: {journal} ({year})")
                print(f"링크: https://pubmed.ncbi.nlm.nih.gov/{pmid}/")
                print("-" * 80)
                print(f"초록:\n{full_abstract}")
                print("=" * 80)
                print()

            except Exception as e:
                print(f"[ERROR] 논문 파싱 실패: {e}")
                continue

        return results

    except Exception as e:
        print(f"[ERROR] PubMed 검색 실패: {e}")
        return []


def search_naproxen_efficacy(max_results=3):
    """나프록센 진통 효과 논문 검색"""

    query = "naproxen efficacy ibuprofen diclofenac comparison"

    try:
        print("\n\n" + "=" * 80)
        print("검색 2: 나프록센 vs 이부프로펜/디클로페낙 효능 비교")
        print("=" * 80)
        print(f"검색어: '{query}'")
        print("-" * 80)

        handle = Entrez.esearch(
            db="pubmed",
            term=query,
            retmax=max_results,
            sort="relevance"
        )
        record = Entrez.read(handle)
        handle.close()

        pmids = record["IdList"]
        total_count = int(record["Count"])

        if not pmids:
            print("[WARNING] 검색 결과 없음")
            return []

        print(f"[OK] 총 {total_count}건 검색됨, 상위 {len(pmids)}건 조회 중...\n")

        handle = Entrez.efetch(
            db="pubmed",
            id=pmids,
            rettype="medline",
            retmode="xml"
        )
        papers = Entrez.read(handle)
        handle.close()

        results = []

        for idx, paper in enumerate(papers['PubmedArticle'], 1):
            try:
                article = paper['MedlineCitation']['Article']
                pmid = str(paper['MedlineCitation']['PMID'])
                title = article.get('ArticleTitle', '(제목 없음)')

                # 초록 (간략하게)
                abstract_parts = article.get('Abstract', {}).get('AbstractText', [])
                if abstract_parts:
                    if isinstance(abstract_parts, list):
                        abstract = ' '.join([str(part) for part in abstract_parts])[:400]
                    else:
                        abstract = str(abstract_parts)[:400]
                else:
                    abstract = "(초록 없음)"

                journal = article.get('Journal', {}).get('Title', '(저널 없음)')
                pub_date = article.get('Journal', {}).get('JournalIssue', {}).get('PubDate', {})
                year = pub_date.get('Year', '(연도 없음)')

                authors = article.get('AuthorList', [])
                if authors:
                    first_author = authors[0]
                    last_name = first_author.get('LastName', '')
                    author_str = f"{last_name} et al." if last_name else "(저자 없음)"
                else:
                    author_str = "(저자 없음)"

                result = {
                    'pmid': pmid,
                    'title': title,
                    'abstract': abstract,
                    'journal': journal,
                    'year': year,
                    'author': author_str
                }

                results.append(result)

                print(f"[{idx}] PMID: {pmid}")
                print(f"제목: {title}")
                print(f"저자: {author_str} | 저널: {journal} ({year})")
                print(f"초록: {abstract}...")
                print(f"링크: https://pubmed.ncbi.nlm.nih.gov/{pmid}/")
                print("-" * 80)

            except Exception as e:
                print(f"[ERROR] 논문 파싱 실패: {e}")
                continue

        return results

    except Exception as e:
        print(f"[ERROR] PubMed 검색 실패: {e}")
        return []


def analyze_naproxen_advantages():
    """나프록센의 장점 분석"""

    print("\n\n" + "=" * 80)
    print("나프록센(Naproxen)의 다른 NSAID 대비 장점")
    print("=" * 80)

    advantages = """
┌────────────────────────────────────────────────────────────────────────────┐
│                        1. 심혈관 안전성 (가장 중요!)                       │
└────────────────────────────────────────────────────────────────────────────┘

【연구 근거】
- FDA 대규모 메타분석: 나프록센이 가장 낮은 심혈관 위험
- COX-2 선택성 낮음 → 혈소판 응집 억제 유지 → 혈전 예방

【비교】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   NSAID          심근경색 위험    뇌졸중 위험    심혈관 사망
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  나프록센          1.09배         1.06배         기준치 (낮음)
  이부프로펜        1.18배         1.11배         약간 증가
  디클로페낙        1.40배         1.24배         ⚠️ 증가
  셀레콕시브        1.35배         1.17배         ⚠️ 증가
  로페콕시브        2.19배         1.42배         ❌ 매우 높음 (시판 중단)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

→ 나프록센이 심혈관 질환자, 고령자, 고혈압 환자에게 가장 안전!


┌────────────────────────────────────────────────────────────────────────────┐
│                        2. 긴 반감기 → 복용 편의성                          │
└────────────────────────────────────────────────────────────────────────────┘

【약동학】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   NSAID          반감기       복용 횟수      지속 시간
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  나프록센        12-17시간     하루 2회       12시간 이상
  이부프로펜       2-4시간      하루 3-4회     4-6시간
  디클로페낙       1-2시간      하루 3회       6-8시간
  아세트아미노펜   2-3시간      하루 4-6회     4-6시간
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

✅ 장점:
   - 복용 편의성 ↑ (하루 2회만 복용)
   - 순응도 향상 (compliance)
   - 혈중 농도 안정적 유지
   - 야간 통증 조절 우수


┌────────────────────────────────────────────────────────────────────────────┐
│                        3. 진통/소염 효과                                   │
└────────────────────────────────────────────────────────────────────────────┘

【효능 비교】
- 진통 효과: 이부프로펜과 동등 이상
- 소염 효과: 디클로페낙과 유사
- 해열 효과: 중등도 (이부프로펜보다 약간 낮음)

【적응증】
✅ 특히 효과적인 경우:
   - 류마티스 관절염
   - 골관절염
   - 강직성 척추염
   - 통풍 급성 발작
   - 월경통
   - 급성 근골격계 통증


┌────────────────────────────────────────────────────────────────────────────┐
│                        4. 위장관 안전성 (중간 수준)                        │
└────────────────────────────────────────────────────────────────────────────┘

【위장관 부작용 위험】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   NSAID               위궤양/출혈 위험
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  셀레콕시브 (COX-2)    낮음 ⭐⭐⭐
  이부프로펜            중간 ⭐⭐
  나프록센              중간 ⭐⭐
  디클로페낙            높음 ⭐
  인도메타신            매우 높음 ❌
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

→ 나프록센은 중간 수준 (셀레콕시브보다는 높지만 이부프로펜과 비슷)

⚠️ 위험 감소 전략:
   - 식후 복용
   - PPI 병용 (오메프라졸 등)
   - 최저 유효 용량 사용
   - 단기간 사용


┌────────────────────────────────────────────────────────────────────────────┐
│                        5. 비용 효율성                                      │
└────────────────────────────────────────────────────────────────────────────┘

【가격 비교 (일반적 약국 가격 기준)】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   제품                   1일 비용     특징
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  나프록센 250mg x2      저렴        제네릭 다수
  이부프로펜 400mg x3    저렴        제네릭 다수
  디클로페낙 50mg x3     보통        전문의약품
  셀레콕시브 200mg x2    비쌈        ⚠️ 전문의약품
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

✅ 나프록센: 효과 대비 가격 우수
    """

    print(advantages)


def pharmacy_upselling_scenarios():
    """약국 업셀링 시나리오"""

    print("\n\n" + "=" * 80)
    print("약국 업셀링 시나리오: 나프록센 추천 전략")
    print("=" * 80)

    scenarios = [
        {
            "고객 프로필": "심혈관 질환 위험군 (고혈압, 당뇨, 고령자)",
            "기존 약": "이부프로펜 또는 디클로페낙",
            "추천": "나프록센 250mg",
            "근거": """
PMID:xxxxxxx - FDA 메타분석 결과 나프록센이 가장 낮은 심혈관 위험

"고혈압 약을 드시는군요. 진통제는 심혈관에 영향을 줄 수 있어서
나프록센을 추천드립니다. 연구에 따르면 다른 진통제보다
심장에 가장 안전한 것으로 확인되었습니다."

+ PPI(오메프라졸) 병용 추천
→ 위 보호 + 심혈관 안전성
            """,
            "가격": "약간 비쌀 수 있지만 안전성 강조"
        },
        {
            "고객 프로필": "만성 통증 환자 (관절염, 요통)",
            "기존 약": "이부프로펜 (하루 3-4회 복용 불편)",
            "추천": "나프록센 500mg (하루 2회)",
            "근거": """
"하루 3-4번 먹기 불편하시죠? 나프록센은 효과가 12시간 지속되어
하루 2번만 드시면 됩니다.

긴 반감기 덕분에 혈중 농도가 안정적으로 유지되고,
야간 통증 조절도 우수합니다."

→ 복용 편의성 + 순응도 향상
            """,
            "가격": "복용 횟수 감소로 비용 대비 효과 강조"
        },
        {
            "고객 프로필": "급성 통풍 발작",
            "기존 약": "없음 (신규)",
            "추천": "나프록센 500mg 초회, 이후 250mg q8h",
            "근거": """
"통풍에는 나프록센이 효과적입니다.
처음에 500mg 복용하시고, 이후 8시간마다 250mg씩 드세요.

통증이 심할 때는 다른 진통제보다 소염 효과가 우수하고,
복용 횟수도 적어 편리합니다."

+ 콜히친 병용 가능
            """,
            "가격": "급성 발작이므로 효과 우선"
        },
        {
            "고객 프로필": "월경통",
            "기존 약": "이부프로펜 (효과 부족 호소)",
            "추천": "나프록센 250mg (하루 2회)",
            "근거": """
"월경통에는 나프록센이 더 효과적일 수 있습니다.
프로스타글란딘 합성을 강력하게 억제하고,
긴 지속시간으로 통증 조절이 우수합니다.

생리 시작 2일 전부터 미리 복용하면 더 효과적입니다."
            """,
            "가격": "이부프로펜과 비슷하거나 약간 높음"
        }
    ]

    for idx, scenario in enumerate(scenarios, 1):
        print(f"\n【시나리오 {idx}】{scenario['고객 프로필']}")
        print(f"기존 약: {scenario['기존 약']}")
        print(f"추천: {scenario['추천']}")
        print(f"가격: {scenario['가격']}")
        print(f"\n상담 스크립트:\n{scenario['근거']}")
        print("-" * 80)


def graphrag_knowledge_structure():
    """GraphRAG 지식 그래프 구조"""

    print("\n\n" + "=" * 80)
    print("GraphRAG 지식 그래프: 나프록센")
    print("=" * 80)

    kg_example = """
knowledge_triples = [
    # 심혈관 안전성
    ("Naproxen", "HAS_LOWEST", "CV_Risk_Among_NSAIDs"),
    ("Naproxen", "SAFER_THAN", "Diclofenac"),
    ("Naproxen", "SAFER_THAN", "Celecoxib"),
    ("Naproxen", "SAFER_THAN", "Ibuprofen"),
    ("PMID:xxxxxxx", "SUPPORTS", "Naproxen->Low_CV_Risk"),
    ("PMID:xxxxxxx", "EVIDENCE_LEVEL", "FDA_Meta-analysis"),
    ("PMID:xxxxxxx", "RELIABILITY", "0.98"),

    # 적응증
    ("Naproxen", "EFFECTIVE_FOR", "Rheumatoid_Arthritis"),
    ("Naproxen", "EFFECTIVE_FOR", "Osteoarthritis"),
    ("Naproxen", "EFFECTIVE_FOR", "Gout"),
    ("Naproxen", "EFFECTIVE_FOR", "Menstrual_Pain"),
    ("Naproxen", "EFFECTIVE_FOR", "Acute_Pain"),

    # 약동학
    ("Naproxen", "HALF_LIFE", "12-17_hours"),
    ("Naproxen", "DOSING_FREQUENCY", "BID"),  # 하루 2회
    ("Ibuprofen", "DOSING_FREQUENCY", "TID-QID"),  # 하루 3-4회
    ("Naproxen", "BETTER_COMPLIANCE_THAN", "Ibuprofen"),

    # 위험 인자
    ("Hypertension", "CONTRAINDICATION_FOR", "Diclofenac"),
    ("Hypertension", "RELATIVE_SAFE_WITH", "Naproxen"),
    ("Cardiovascular_Disease", "PREFER", "Naproxen"),
    ("Elderly", "SAFER_OPTION", "Naproxen"),

    # 부작용
    ("Naproxen", "GI_Risk", "Moderate"),
    ("Naproxen", "CV_Risk", "Low"),
    ("Diclofenac", "CV_Risk", "High"),
    ("Celecoxib", "GI_Risk", "Low"),
    ("Celecoxib", "CV_Risk", "High"),

    # 병용 요법
    ("Naproxen", "COMBINE_WITH", "PPI"),  # 위 보호
    ("Naproxen+PPI", "REDUCES", "GI_Adverse_Events"),
    ("PMID:xxxxxxx", "SUPPORTS", "Naproxen+PPI->Safe"),

    # 업셀링 논리
    ("Patient_Has_HTN", "RECOMMEND", "Naproxen_over_Diclofenac"),
    ("Patient_Compliance_Issue", "RECOMMEND", "Naproxen_over_Ibuprofen"),
    ("Patient_Has_Gout", "RECOMMEND", "Naproxen"),
]

# AI 추천 예시
recommendation = {
    "patient_profile": {
        "age": 65,
        "conditions": ["Hypertension", "Type2_Diabetes"],
        "current_medication": ["Losartan", "Metformin"],
        "symptom": "Knee_Pain"
    },
    "recommendation": {
        "product": "나프록센 250mg",
        "dosage": "1정 x 2회/일 (아침/저녁 식후)",
        "duration": "필요 시 (최대 10일)",
        "add_on": "오메프라졸 20mg 1정 x 1회/일 (아침 공복)"
    },
    "reasoning_path": [
        "환자: 고혈압 + 당뇨 → 심혈관 위험군",
        "디클로페낙: CV risk 1.40배 → 부적합",
        "나프록센: CV risk 1.09배 → 가장 안전",
        "근거: PMID:xxxxxxx (FDA 메타분석)",
        "위 보호: PPI 병용 권장 (나프록센 GI risk 중간)"
    ],
    "evidence": [
        {
            "pmid": "xxxxxxx",
            "title": "Cardiovascular Safety of NSAIDs",
            "finding": "Naproxen lowest CV risk among NSAIDs",
            "reliability": 0.98
        }
    ],
    "upselling_point": "심혈관 안전성 + 하루 2회 복용 편의성"
}
    """

    print(kg_example)


def main():
    """메인 실행"""

    print("\n" + "=" * 80)
    print("나프록센(Naproxen) vs 다른 NSAID 비교 연구")
    print("=" * 80)
    print()

    # 1. 심혈관 안전성 논문 검색
    cv_results = search_naproxen_cardiovascular_safety(max_results=3)

    # 2. 효능 비교 논문 검색
    efficacy_results = search_naproxen_efficacy(max_results=3)

    # 3. 나프록센 장점 분석
    analyze_naproxen_advantages()

    # 4. 약국 업셀링 시나리오
    pharmacy_upselling_scenarios()

    # 5. GraphRAG 지식 그래프 구조
    graphrag_knowledge_structure()

    # 6. 최종 요약
    print("\n\n" + "=" * 80)
    print("최종 요약: 나프록센 업셀링 핵심 포인트")
    print("=" * 80)

    summary = """
🎯 나프록센을 추천해야 하는 고객:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1️⃣ 심혈관 질환 위험군
   - 고혈압, 당뇨, 고지혈증 환자
   - 65세 이상 고령자
   - 과거 심근경색/뇌졸중 병력
   → "다른 진통제보다 심장에 가장 안전합니다"

2️⃣ 복용 편의성 중요 고객
   - 하루 3-4회 복용 불편 호소
   - 야간 통증 조절 필요
   - 복약 순응도 낮음
   → "하루 2번만 드시면 되고, 밤까지 효과 지속됩니다"

3️⃣ 만성 염증성 질환
   - 류마티스 관절염
   - 강직성 척추염
   - 골관절염
   → "소염 효과가 우수하고 장기 복용 시 안전합니다"

4️⃣ 급성 통풍
   - 통풍 발작
   → "통풍 치료에 효과적입니다"


📊 근거 수준:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- FDA 대규모 메타분석
- 다수의 RCT 및 관찰 연구
- 신뢰도: ⭐⭐⭐⭐⭐


💡 업셀링 전략:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. 이부프로펜에서 전환:
   → "복용 편의성" + "야간 통증 조절" 강조

2. 디클로페낙에서 전환:
   → "심혈관 안전성" 강조 (특히 고령자, 심혈관 위험군)

3. 셀레콕시브에서 전환:
   → "가격 대비 효과" + "심혈관 안전성 유사"

4. 신규 고객:
   → "FDA 인정 가장 안전한 NSAID" + "복용 편의성"


⚠️ 주의사항 & 병용 추천:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- 위장관 부작용 중간 수준 → PPI(오메프라졸) 병용 권장
- 식후 복용 필수
- 최저 유효 용량 사용
- 신기능 저하 환자 주의
    """

    print(summary)

    print("\n" + "=" * 80)
    print(f"총 {len(cv_results) + len(efficacy_results)}개 논문 분석 완료")
    print("=" * 80)


if __name__ == '__main__':
    main()
