"""Pairwise judge with both positions. Code: MIT. No candidate is from Pareto."""
import json
import os

MODEL = os.environ.get('MODEL', 'pareto')
BASE_URL = os.environ.get('BASE_URL', 'https://api.unbiased.ai/v1')


def request(item, config, swapped=False):
    a, b = item['answer_a'], item['answer_b']
    if swapped:
        a, b = b, a
    return {'messages': [
        {'role': 'system', 'content': config['prompt']},
        {'role': 'user', 'content': json.dumps({'question': item['text'], 'A': a, 'B': b}, ensure_ascii=False)}],
        'tools': [{'type': 'function', 'function': {'name': 'grade', 'description': 'Record the preferred answer and a short reason.',
            'parameters': {'type': 'object', 'properties': {'choice': {'type': 'string', 'enum': ['A', 'B', 'equal']},
                'reason': {'type': 'string'}}, 'required': ['choice', 'reason'], 'additionalProperties': False}}}],
        'tool_choice': config['tool_choice'], 'parallel_tool_calls': False,
        'max_tokens': config['max_tokens'], 'reasoning_effort': config['reasoning_effort']}


def plan_requests(item, config):
    return [request(item, config), request(item, config, True)]


def parse(response):
    calls = response['choices'][0]['message'].get('tool_calls') or []
    if len(calls) != 1 or calls[0]['function']['name'] != 'grade':
        return {'choice': 'invalid', 'reason': 'Expected exactly one grade call.'}
    try:
        args = json.loads(calls[0]['function']['arguments'])
        if set(args) != {'choice', 'reason'} or args['choice'] not in ('A', 'B', 'equal') or not isinstance(args['reason'], str):
            raise ValueError('invalid schema')
        return args
    except (ValueError, TypeError):
        return {'choice': 'invalid', 'reason': 'Invalid grade arguments.'}


def generate(item, config, call):
    return {'original': parse(call(request(item, config))),
            'swapped': parse(call(request(item, config, True)))}
