# -*- coding: utf-8 -*-
"""
domeggook getItemView API 유틸
- status 조회(판매중/판매완료/품절/중지 등)
- 대표 thumb URL(상세 thumb) 판별

Search_DomeDuplicate_4stDomeme.py 등에서 import하여 사용.
"""

from __future__ import annotations

import asyncio
import re
import os
from typing import Any

import aiohttp


DEFAULT_DMM_ITEMVIEW_AID = "8429d3906b311951273697483375e539"
DEFAULT_DMM_ITEMVIEW_URL = "https://domeggook.com/ssl/api"


def _norm_str(x: Any) -> str | None:
    if x is None:
        return None
    try:
        s = str(x).strip()
    except Exception:
        return None
    return s or None


async def fetch_itemview_json(
    session: aiohttp.ClientSession,
    icode: int,
    *,
    sem: asyncio.Semaphore | None = None,
    aid: str = DEFAULT_DMM_ITEMVIEW_AID,
    url: str = DEFAULT_DMM_ITEMVIEW_URL,
    timeout_total: float = 8.0,
) -> dict | None:
    """
    domeggook getItemView 원본 JSON 조회.
    실패/없음(errors) 시 None 반환.
    """
    debug = str(os.environ.get("DOME_DMM_ITEMVIEW_DEBUG", "")).strip().lower() in ("1", "true", "y", "yes", "on")
    try:
        if not icode:
            return None
        params = {
            "ver": "4.5",
            "mode": "getItemView",
            "aid": str(aid),
            "no": str(int(icode)),
            "om": "json",
        }

        async def _do_once():
            async with session.get(
                url,
                params=params,
                timeout=aiohttp.ClientTimeout(total=timeout_total),
                headers={
                    # 일부 환경에서 UA 없으면 차단/축소 응답이 오는 경우가 있어 기본 UA를 넣는다.
                    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) domeggook-itemview/1.0",
                    "Accept": "application/json,text/plain,*/*",
                },
            ) as r:
                if r.status != 200:
                    if debug:
                        try:
                            ct = r.headers.get("content-type")
                        except Exception:
                            ct = None
                        print(f"[DMM_ITEMVIEW][HTTP_{r.status}] ct={ct} no={icode}")
                    return None
                try:
                    data = await r.json(content_type=None)
                except Exception as e:
                    if debug:
                        try:
                            txt = await r.text(errors="ignore")
                            snip = (txt[:200] + "...") if len(txt) > 200 else txt
                        except Exception:
                            snip = None
                        print(f"[DMM_ITEMVIEW][JSON_FAIL] no={icode} err={type(e).__name__} snip={snip!r}")
                    return None
                if isinstance(data, dict) and data.get("errors"):
                    if debug:
                        print(f"[DMM_ITEMVIEW][API_ERRORS] no={icode} errors={data.get('errors')!r}")
                    return None
                return data if isinstance(data, dict) else None

        if sem is None:
            # 간단 재시도(1회): timeout/일시적 장애 완화
            for _ in range(2):
                data = await _do_once()
                if data:
                    return data
            return None
        async with sem:
            for _ in range(2):
                data = await _do_once()
                if data:
                    return data
            return None
    except Exception:
        if debug:
            import traceback

            print(f"[DMM_ITEMVIEW][EXC] no={icode}")
            traceback.print_exc(limit=2)
        return None


async def fetch_dmm_item_status(
    session: aiohttp.ClientSession,
    icode: int,
    *,
    sem: asyncio.Semaphore | None = None,
    aid: str = DEFAULT_DMM_ITEMVIEW_AID,
    url: str = DEFAULT_DMM_ITEMVIEW_URL,
    timeout_total: float = 8.0,
) -> tuple[str | None, str | None, dict | None]:
    """
    getItemView API로 status/title을 조회.
    반환:
      (status, title, raw_json)
    실패 시:
      (None, None, None)
    """
    data = await fetch_itemview_json(
        session,
        icode,
        sem=sem,
        aid=aid,
        url=url,
        timeout_total=timeout_total,
    )
    if not data:
        return None, None, None

    domeggook = data.get("domeggook") or {}
    basis = domeggook.get("basis") if isinstance(domeggook, dict) else None
    if not isinstance(basis, dict):
        basis = {}

    status = _norm_str(basis.get("status"))
    title = _norm_str(basis.get("title") or basis.get("iname") or basis.get("name"))
    return status, title, data


def extract_best_thumb_url(itemview_json: dict | None) -> str | None:
    """
    "상세한 thumb 판별" (대표 이미지 URL 선택)
    우선순위:
      1) domeggook.thumb.original/large/small/largePng/smallPng
      2) basis 대표 이미지 키들(representative_* / image / img 등)
      3) desc.contents.item HTML의 첫 <img src="...">
    """
    if not isinstance(itemview_json, dict):
        return None
    domeggook = itemview_json.get("domeggook") or {}
    if not isinstance(domeggook, dict):
        return None

    rep_img = None

    # 1) thumb
    thumb = domeggook.get("thumb") or {}
    if isinstance(thumb, dict):
        rep_img = (
            thumb.get("original")
            or thumb.get("large")
            or thumb.get("small")
            or thumb.get("largePng")
            or thumb.get("smallPng")
        )

    # 2) basis legacy keys
    if not rep_img:
        basis = domeggook.get("basis") or {}
        if not isinstance(basis, dict):
            basis = {}
        rep_img = (
            basis.get("representative_img")
            or basis.get("representativeImg")
            or basis.get("representative_image")
            or basis.get("image")
            or basis.get("img")
        )
        if isinstance(rep_img, list) and rep_img:
            rep_img = rep_img[0]
        if isinstance(rep_img, dict):
            rep_img = rep_img.get("url") or rep_img.get("src")

    # 3) desc.contents.item HTML first img
    if not rep_img:
        desc = domeggook.get("desc") or {}
        if isinstance(desc, dict):
            contents = desc.get("contents") or {}
            if isinstance(contents, dict):
                html = contents.get("item")
                if isinstance(html, str) and html:
                    m = re.search(r'<img[^>]+src=["\\\']([^"\\\']+)["\\\']', html, flags=re.IGNORECASE)
                    if m:
                        rep_img = m.group(1)

    return _norm_str(rep_img)

