# -*- coding: utf-8 -*-
"""산업별 AI 노출 지표의 재조회(ONLINE=1에서만 쓴다).

  · 논문 : OpenAlex — 2023–2025년 문헌을 주제 분야(primary_topic.field)별로 세고, 그중 'Artificial intelligence' 개념(C154945302) 문헌을 다시 센다.
  · 뉴스 : Event Registry — 2025년 영문 뉴스에서 업종 키워드 기사 수와, 같은 키워드 AND 'artificial intelligence' 기사 수를 센다(timeAggr 일별 합계).
  · 특허 : FindIP는 MCP 연결로만 조회할 수 있어 여기서 다시 받지 않는다. 조회 조건은 data/inputs/FINDIP_QUERY.md에 적었다.
인증키(OPENALEX_API_KEY 선택, EVENTREGISTRY_API_KEY 필수)는 환경변수에서만 읽는다.
"""
from __future__ import annotations

import os

import pandas as pd
import requests

OPENALEX = "https://api.openalex.org/works"
EVENTREGISTRY = "https://eventregistry.org/api/v1/article/getArticles"
AI_CONCEPT = "concepts.id:C154945302"


def _openalex_by_field(filt: str) -> pd.Series:
    params = {"filter": filt, "group_by": "primary_topic.field.id", "per-page": 200}
    key = os.environ.get("OPENALEX_API_KEY")
    if key:
        params["api_key"] = key
    r = requests.get(OPENALEX, params=params, timeout=60)
    r.raise_for_status()
    return pd.Series({x["key_display_name"]: int(x["count"]) for x in r.json()["group_by"]})


def openalex_field_share(y0: int = 2023, y1: int = 2025) -> pd.DataFrame:
    """분야별 AI 논문 수·전체 논문 수·AI 비중(%)."""
    tot = _openalex_by_field(f"publication_year:{y0}-{y1}")
    ai = _openalex_by_field(f"{AI_CONCEPT},publication_year:{y0}-{y1}")
    d = pd.DataFrame({"AI논문": ai, "전체논문": tot}).dropna().astype(int)
    d["AI비중_%"] = 100.0 * d["AI논문"] / d["전체논문"]
    d.index.name = "분야(OpenAlex field)"
    return d.sort_values("AI비중_%", ascending=False)


def _er_count(keywords: list[str], year: int) -> int:
    q = {"action": "getArticles", "keyword": keywords if len(keywords) > 1 else keywords[0], "keywordOper": "and",
         "lang": "eng", "dateStart": f"{year}-01-01", "dateEnd": f"{year}-12-31",
         "resultType": "timeAggr", "dataType": ["news"], "apiKey": os.environ["EVENTREGISTRY_API_KEY"]}
    r = requests.post(EVENTREGISTRY, json=q, timeout=180)
    r.raise_for_status()
    return int(sum(x["count"] for x in r.json().get("timeAggr", {}).get("results", [])))


def eventregistry_industry_share(keywords: pd.Series, year: int = 2025) -> pd.DataFrame:
    """업종(index)별 키워드 기사 수와 'artificial intelligence'를 함께 다룬 기사 수, 그 비율(%). 조회는 업종당 2회."""
    rows = []
    for ind, kw in keywords.items():
        n_all = _er_count([kw], year)
        n_ai = _er_count([kw, "artificial intelligence"], year)
        rows.append({"설문업종": ind, "키워드": kw, "기사수_업종": n_all, "기사수_업종AND_AI": n_ai,
                     "AI비중_%": 100.0 * n_ai / n_all if n_all else float("nan")})
    return pd.DataFrame(rows)
