"""Forced-tool localization with one structural repair. Code MIT."""
import json
import types
from pathlib import Path

checker = types.ModuleType('localization_checker')
exec(compile(Path(__file__).with_name('check.py').read_bytes(), 'check.py', 'exec'), checker.__dict__)


def request(item, config):
    user = {k: item[k] for k in ('locale', 'key', 'text')}
    user['glossary'] = item['expected']['glossary']
    user['plural_categories'] = item['expected']['plural_categories']
    return {'messages': [{'role': 'system', 'content': config['prompt']},
                         {'role': 'user', 'content': json.dumps(user, ensure_ascii=False)}],
            'tools': [{'type': 'function', 'function': {'name': 'record',
                'description': 'Record one translated application string.',
                'parameters': {'type': 'object', 'properties': {'key': {'type': 'string'}, 'translation': {'type': 'string'}},
                               'required': ['key', 'translation'], 'additionalProperties': False}}}],
            'tool_choice': config['tool_choice'], 'max_tokens': config['max_tokens'],
            'reasoning_effort': config['reasoning_effort']}


def arguments(response):
    calls = response['choices'][0].get('message', {}).get('tool_calls') or []
    try:
        if len(calls) != 1 or calls[0]['function']['name'] != 'record':
            return {}
        value = json.loads(calls[0]['function']['arguments'])
        return value if isinstance(value, dict) else {}
    except (KeyError, ValueError, TypeError):
        return {}


def generate(item, config, call):
    payload = request(item, config)
    first = arguments(call(payload))
    checks = checker.inspect(item, first)
    failures = [k for k, value in checks.items() if value != (1 if k != 'broken' else 0)]
    if failures:
        # Rejected extra calls are not executed or silently selected. A fresh
        # user message includes the rejected value and exact checker feedback.
        payload['messages'].append({'role': 'user', 'content': json.dumps({'previous': first, 'failed_checks': failures, 'instruction': 'Repair these structural failures. Return exactly one record call.'}, ensure_ascii=False)})
        call(payload)


def plan_requests(item, config):
    first = request(item, config)
    retry = request(item, config)
    retry['messages'].append({'role': 'user', 'content': json.dumps({'previous': {'key': item['key'], 'translation': item['text']}, 'failed_checks': ['broken', 'plural_complete'], 'instruction': 'Repair these structural failures. Return exactly one record call.'})})
    return [first, retry]
