"""Tests for profile_config.py profile-to-config mapping."""

import json
import pytest

from profile_config import profile_to_config


class TestProfileToConfig:
    """Tests for profile_to_config() mapping function."""

    def test_standard_fields(self, sample_profile_data):
        config = profile_to_config(sample_profile_data)
        assert config['agent_a_name'] == 'Serena'
        assert config['llm_model'] == 'qwen3.5-flash'
        assert config['temperature'] == 0.7
        assert config['max_tokens'] == 150
        assert config['top_p'] == 0.9
        assert config['enable_omni'] is True
        assert config['omni_model'] == 'qwen3.5-omni-plus-realtime'

    def test_conversation_validator_json_string(self, sample_profile_data):
        config = profile_to_config(sample_profile_data)
        assert 'conversation_validator' in config
        cv = config['conversation_validator']
        assert cv['enabled'] is True
        assert cv['api_url'] == 'https://validator.example.com/validate'
        assert cv['api_key'] == 'cv-key'

    def test_conversation_validator_dict(self):
        data = {
            'conversationValidator': {
                'enabled': False,
                'api_url': 'https://test.com',
            }
        }
        config = profile_to_config(data)
        assert config['conversation_validator']['enabled'] is False

    def test_acrs_json_string(self, sample_profile_data):
        config = profile_to_config(sample_profile_data)
        assert 'acrs' in config
        assert config['acrs']['enabled'] is True
        assert config['acrs']['api_key'] == 'test-key'

    def test_emotion_config(self, sample_profile_data):
        config = profile_to_config(sample_profile_data)
        assert 'emotion' in config
        assert config['emotion']['enabled'] is False
        assert config['emotion']['engine_url'] == 'ws://localhost:8769'

    def test_voice_map(self, sample_profile_data):
        config = profile_to_config(sample_profile_data)
        assert config['voice_map'] == {'en': 'Ethan', 'zh': 'Cherry'}

    def test_custom_tools(self, sample_profile_data):
        config = profile_to_config(sample_profile_data)
        assert isinstance(config['custom_tools'], list)
        assert len(config['custom_tools']) == 1
        assert config['custom_tools'][0]['function']['name'] == 'test_tool'

    def test_transfer_agents(self, sample_profile_data):
        config = profile_to_config(sample_profile_data)
        assert isinstance(config['transfer_agents'], list)
        assert config['transfer_agents'][0]['name'] == 'Sales'

    def test_allowed_languages(self, sample_profile_data):
        config = profile_to_config(sample_profile_data)
        assert config['allowed_languages'] == ['en', 'zh', 'ms']

    def test_per_language_greeting(self, sample_profile_data):
        config = profile_to_config(sample_profile_data)
        greeting = config['fixed_greeting']
        assert isinstance(greeting, dict)
        assert greeting['en'] == 'Hello!'
        assert greeting['zh'] == '你好！'

    def test_plain_string_instructions(self, sample_profile_data):
        config = profile_to_config(sample_profile_data)
        assert config['instructions'] == 'You are a receptionist.'

    def test_invalid_json_gracefully_skipped(self):
        data = {
            'conversationValidator': 'not valid json {{{',
            'acrs': '{invalid}',
        }
        config = profile_to_config(data)
        assert 'conversation_validator' not in config
        assert 'acrs' not in config

    def test_backward_compat_agent_b(self):
        data = {
            'enableAgentB': True,
            'agentBName': 'Support',
            'agentBInstructions': 'Help with support.',
        }
        config = profile_to_config(data)
        assert 'transfer_agents' in config
        assert config['transfer_agents'][0]['name'] == 'Support'

    def test_empty_profile(self):
        config = profile_to_config({})
        assert config == {'type': 'config'}

    def test_vad_threshold(self):
        data = {'vadThreshold': '0.5'}
        config = profile_to_config(data)
        assert config['vad_threshold'] == 0.5

    def test_barge_in_enabled(self):
        data = {'bargeInEnabled': True}
        config = profile_to_config(data)
        assert config['barge_in_enabled'] is True
