"""Construye `Archivos/pixiv_nsfw_pool.json` midiendo que tags existen.

Un tag existe si `/ajax/search/artworks/{tag}` devuelve `total > 0`. Se guarda
el total (nº de obras) como peso y la categoria curada. Nada se inventa: si una
candidata no devuelve obras, se descarta y se informa.
"""
import json
import sys
import time
import urllib.parse
from pathlib import Path

import requests

sys.stdout.reconfigure(encoding="utf-8", errors="backslashreplace")

BASE = Path(__file__).resolve().parent.parent
OUT = BASE / "Archivos" / "pixiv_nsfw_pool.json"

S = requests.Session()
S.headers.update({
    "User-Agent": ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                   "(KHTML, like Gecko) Chrome/124.0 Safari/537.36"),
    "Referer": "https://www.pixiv.net/",
    "Accept": "application/json",
})

CANDS = {
    "cuerpo": ["巨乳", "爆乳", "美乳", "おっぱい", "谷間", "ふともも", "太もも",
               "巨尻", "むちむち", "むっちり", "腋", "美脚", "褐色", "日焼け跡",
               "着衣巨乳", "魅惑の谷間", "魅惑のふともも", "極上の乳", "極上の女体"],
    "acto": ["中出し", "パイズリ", "フェラ", "手コキ", "騎乗位", "正常位", "後背位",
             "事後", "潮吹き", "種付け", "孕ませ", "断面図", "セックス", "愛撫",
             "クンニ", "足コキ", "素股", "寝取られ", "NTR", "輪姦"],
    "estado": ["全裸", "半裸", "着衣", "濡れ", "愛液", "アヘ顔", "絶頂", "失神",
               "精液", "溢れ精液", "妊娠", "ボテ腹", "汗", "密着", "キス"],
    "ropa": ["下着", "透け", "競泳水着", "水着", "ビキニ", "黒タイツ", "ニーソ",
             "ガーター", "網タイツ", "裸エプロン", "マイクロビキニ", "チャイナドレス",
             "体操服", "制服", "レオタード", "ボンデージ"],
    "encuadre": ["手錠", "目隠し", "拘束", "首輪", "見下し", "喘ぎ", "手ブラ"],
}


def works(tag: str) -> int:
    q = urllib.parse.quote(tag)
    for i in range(3):
        try:
            r = S.get("https://www.pixiv.net/ajax/search/artworks/" + q,
                      params={"word": tag, "order": "date_d", "mode": "all",
                              "p": 1, "s_mode": "s_tag_full", "type": "all",
                              "lang": "ja"}, timeout=20)
            r.raise_for_status()
            body = (r.json() or {}).get("body") or {}
            return int((body.get("illustManga") or {}).get("total") or 0)
        except Exception as e:
            if i == 2:
                print(f"  ! {tag}: {type(e).__name__}")
                return 0
            time.sleep(3 * (2 ** i))
    return 0


def main() -> None:
    pool, dead = {}, []
    for cat, tags in CANDS.items():
        for tag in tags:
            n = works(tag)
            print(f"{cat:<9} {tag:<12} {n:>10,}")
            if n > 0:
                pool[tag] = {"cat": cat, "works": n}
            else:
                dead.append(tag)
            time.sleep(1.1)
    OUT.parent.mkdir(parents=True, exist_ok=True)
    OUT.write_text(json.dumps(pool, ensure_ascii=False, indent=1),
                   encoding="utf-8")
    print(f"\n[OK] {len(pool)} tags vivos -> {OUT}")
    if dead:
        print(f"[!] descartados ({len(dead)}): {', '.join(dead)}")


if __name__ == "__main__":
    main()
