#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""组卷「出同类题」路由：选中原题的题型命中确定性生成器 → 保正确、带答案；
命不中（长尾/概念题）→ 返回 None，交回 DeepSeek。

生成器框架（自动出题/core + gen）纯 stdlib，可安全 import 进本服务端。
启动时建一次题型索引并缓存，避免每请求重扫 gen/。
"""
import os, sys, random

_AUTO = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', '自动出题')
if _AUTO not in sys.path:
    sys.path.insert(0, _AUTO)

try:
    from core import registry, harness   # noqa: E402
    _INDEX = registry.build_index()      # {关键词: [模块,...]}，启动一次
    _READY = True
    _ERR = ''
except Exception as e:                    # 生成器不可用时整体降级：route 恒返 None，服务照跑
    _READY, _ERR, _INDEX = False, str(e), {}

# 组卷库难度数字（胡小群 1–5，其余库 0）→ 生成器难度档
_DIFF = {0: '中', 1: '易', 2: '易', 3: '中', 4: '难', 5: '难'}


def _level(difficulty):
    try:
        return _DIFF.get(int(difficulty), '中')
    except (TypeError, ValueError):
        return '中'


def route(topic, difficulty, cnt=3, grade='', seed=None):
    """命中→list[dict]（type/stem/answer/detail/by）；命不中或未就绪→None（交回 DeepSeek）。
    grade：组卷库的册次/年级串（'三年级上·普通版2026秋'/'八上'/'一·二年级'…），
    用于学段+年级隔离，防止跨年级串题。

    匹配与年级门全部由 registry.find 负责——**这里不再自带一份匹配逻辑**。
    （踩过：本文件曾复制过一份朴素的双向子串匹配，导致 registry 里修好的规则根本没进生产，
     线上还在用旧逻辑把「整数乘除法巧算」判成二年级表内乘除。路由只留一处实现。）
    """
    if not _READY or not topic:
        return None
    mod = registry.find(topic.strip(), grade=grade or '', index=_INDEX)
    if mod is None:
        return None
    try:
        n = max(1, min(20, int(cnt)))
    except (TypeError, ValueError):
        n = 3
    # 变体也按专题名锁定：题名点明了知识点（「…根与系数关系」）就只出那几个变体，
    # 否则才退回难度档随机。不锁的话，连点几次"再出一批"知识点会自己跑偏。
    # plan_for_topic 连难度档一起给——变体和档的 cfg 是配套的，只换变体会 KeyError。
    vs, diff = registry.plan_for_topic(mod, topic.strip(), _level(difficulty))
    # seed 复现契约（PrairieLearn/STACK/Numbas 全都有）：同 (专题,难度,道数,seed) 必出同一批题。
    # 这是等价 A/B 卷、错题同构重练的基础设施 —— harness 本来就是 seed 纯函数，
    # 这里原先每次 randrange 把复现性丢掉了，现在把 seed 通到 API 层。
    if seed is None:
        seed = random.randrange(1 << 30)
    try:
        seed = int(seed) & ((1 << 30) - 1)
    except (TypeError, ValueError):
        seed = random.randrange(1 << 30)
    try:
        items = harness.generate(mod, diff, vs, n, seed=seed)
    except Exception:                          # 单个题型出问题不该让整个接口 500，回退 LLM
        return None
    if not items:
        return None
    return [{'type': it.variant, 'stem': it.stem, 'answer': it.answer,
             'detail': it.detail, 'by': 'generator', 'seed': seed,
             'topic': it.topic, 'difficulty': it.difficulty} for it in items]

def status():
    if not _READY:
        return {'ready': False, 'error': _ERR}
    return {'ready': True,
            'topics': sorted({m.TOPIC for mods in _INDEX.values() for m in mods})}
