# -*- coding: utf-8 -*-
import csv, re
from collections import Counter

CSV = "_meta/list_person_all_extended_utf8.csv"
OUT = "manifest.csv"

rows = list(csv.reader(open(CSV, encoding="utf-8")))
H = [h.lstrip("\ufeff") for h in rows[0]]
idx = {n: i for i, n in enumerate(H)}
data = rows[1:]

FICTION = {"913", "923", "933", "943", "953", "983", "929"}

def ndc_main(cat):
    m = re.search(r"NDC\s*K?([0-9]{3})", cat)
    return m.group(1) if m else None

def is_fiction(r):
    cat = r[idx["分類番号"]].strip()
    n = ndc_main(cat)
    return (n in FICTION) or ("K913" in cat)

def author_key(r):
    return (r[idx["姓"]].strip(), r[idx["名"]].strip())

def title_norm(t):
    return re.sub(r"[《》「」『』\s]", "", t)

novels = [r for r in data if is_fiction(r) and r[idx["テキストファイルURL"]].strip()]

best = {}
for r in novels:
    k = (author_key(r), title_norm(r[idx["作品名"]]))
    kana = r[idx["文字遣い種別"]].strip()
    score = (0 if kana == "新字新仮名" else 1 if kana == "新字旧仮名" else 2,
             r[idx["テキストファイル最終更新日"]])
    if k not in best or score > best[k][0]:
        best[k] = (score, r)

dedup = [v[1] for v in best.values()]
print("小說去重後:", len(dedup))

is_children = lambda r: "K913" in r[idx["分類番号"]]
children = [r for r in dedup if is_children(r)]
adult = [r for r in dedup if not is_children(r)]
print("児童文學:", len(children), "一般小說:", len(adult))

def kana(r): return r[idx["文字遣い種別"]].strip()
def rank(r):
    order = {"新字新仮名":0, "新字旧仮名":1, "旧字新仮名":2, "旧字旧仮名":3}
    return (order.get(kana(r),9), r[idx["テキストファイル最終更新日"]], r[idx["作品ID"]])

children_sorted = sorted(children, key=rank)
adult_sorted = sorted(adult, key=rank)

def take(pool, cap_total, per_author):
    out, ac = [], Counter()
    for r in pool:
        if len(out) >= cap_total:
            break
        a = author_key(r)
        if ac[a] >= per_author:
            continue
        out.append(r); ac[a] += 1
    return out

sel_children = take(children_sorted, 450, 25)
remaining = 1100 - len(sel_children)
sel_adult = take(adult_sorted, remaining, 40)
selected = sel_children + sel_adult
print("選取: 児童 %d + 一般 %d = %d" % (len(sel_children), len(sel_adult), len(selected)))

FIELDS = ["作品ID","作品名","作品名読み","姓","名","姓読み","名読み","分類番号",
          "文字遣い種別","公開日","テキストファイルURL","テキストファイル最終更新日",
          "図書カードURL","初出","生年月日","没年月日"]
with open(OUT, "w", encoding="utf-8", newline="") as f:
    w = csv.writer(f)
    w.writerow(FIELDS)
    for r in selected:
        w.writerow([r[idx[f]] for f in FIELDS])

print("manifest 寫入:", OUT)
ac = Counter(author_key(r) for r in selected)
print("作者總數:", len(ac))
for a, c in ac.most_common(20):
    print(f"  {a[0]} {a[1]}: {c}")
