"""Offline checks of paid-review privacy, one-call behavior and unknown failure cost."""
import json
import os
import sys
import tempfile
import unittest
from pathlib import Path
from unittest import mock

ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / 'scripts' / 'game_harness'))
import env
env.install({'ai_provider': 'anthropic', 'anthropic_model': 'claude-sonnet-5-5', 'anthropic_effort': 'high'})

import story
from wcs.ai import AIProvider, UsageTracker
from wcs.games.millionaire.subject import Subject


class ReviewTests(unittest.TestCase):
    def test_one_call_and_content_capture_is_explicit_without_hidden_reasoning(self):
        pack = json.loads((ROOT / 'resources/demo/story/matrix/easy.json').read_text())
        response = (json.dumps(pack), {'input_tokens': 100, 'output_tokens': 200},
                    {'model': 'claude-sonnet-5-5', 'stop_reason': 'end_turn',
                     'content': [{'type': 'thinking', 'thinking': 'hidden-test-reasoning'}]})
        for capture in (False, True):
            with self.subTest(capture=capture), tempfile.TemporaryDirectory() as folder, \
                    mock.patch.object(AIProvider, 'send_prompt', return_value=response) as sender, \
                    mock.patch.object(UsageTracker, 'describe_session'):
                result = story.review(Subject(title='Matrix', year=1999), 'easy', folder, capture)
                self.assertEqual((result['verdict'], result['calls'], result['scenes']), ('PASS', 1, 10))
                self.assertEqual((result['output_budget'], result['request_timeout']), (32000, 300))
                self.assertGreater(result['cost_usd'], 0)
                self.assertEqual(sender.call_count, 1)
                self.assertTrue(sender.call_args.kwargs['private_content'])
                self.assertFalse(sender.call_args.kwargs['use_tools'])
                self.assertEqual(Path(folder, 'diagnostic.json').exists(), capture)
                self.assertEqual(Path(folder, 'pack.json').exists(), capture)
                for path in Path(folder).iterdir():
                    self.assertNotIn('hidden-test-reasoning', path.read_text())

    def test_failed_call_without_usage_is_not_reported_as_free_or_retried(self):
        with tempfile.TemporaryDirectory() as folder, \
                mock.patch.object(AIProvider, 'send_prompt', side_effect=TimeoutError('private-provider-body')) as sender, \
                mock.patch.object(UsageTracker, 'describe_session'):
            result = story.review(Subject(title='Matrix', year=1999), 'easy', folder)
            self.assertEqual((result['verdict'], result['calls']), ('FAIL', 1))
            self.assertIsNone(result['cost_usd'])
            self.assertEqual(sender.call_count, 1)
            self.assertEqual(set(os.listdir(folder)), {'summary.json', 'report.md'})
            self.assertNotIn('private-provider-body', Path(folder, 'report.md').read_text())


if __name__ == '__main__':
    unittest.main()
