"""One fresh whole-pack inference per attempt, through the common provider boundary."""
import json
import uuid
from random import shuffle

from wcs.games.story import prompts
from wcs.games.story.content import Pack, Scene, parse


class AiSource:
    name = 'ai'

    def prepare(self, subject, difficulty):
        import xbmcaddon
        from wcs.ai import accounts
        from wcs.ai.AIProvider import send_prompt
        from wcs.ai.response_json import clean_response
        from wcs.ai.UsageTracker import describe_session
        session = 'story_' + uuid.uuid4().hex[:12]
        describe_session(session, subject.title)
        system, request = prompts.build(subject, difficulty)
        addon = xbmcaddon.Addon()
        effort_setting = {'openai': 'openai_reasoning_effort', 'anthropic': 'anthropic_effort'}.get(
            accounts.resolve(addon=addon))
        options = {'max_output_tokens': 16000}
        # Whole-pack preparation needs room for high-effort reasoning as well as the final JSON.
        if effort_setting and addon.getSetting(effort_setting) in ('high', 'xhigh', 'max'):
            options.update(max_output_tokens=32000, request_timeout=300)
        response, _usage = send_prompt(request, system_prompt=system, json_mode=True, use_tools=False,
                                      usage_type='story_prepare', session_id=session, private_content=True, **options)
        pack = parse(json.loads(clean_response(response)), difficulty, subject)
        # Correct letters vary locally without changing any canonical event or storing previous games.
        scenes = []
        for scene in pack.scenes:
            order = list(range(4))
            shuffle(order)
            scenes.append(Scene(scene.chapter, scene.setup, scene.question,
                                tuple(scene.options[index] for index in order), order.index(scene.correct), scene.reveal))
        return Pack(pack.difficulty, tuple(scenes), pack.ending)
