"""CP-8 Phase 3 — model_profiles + provider_strategy entries for audio + lipsync."""

import json
from pathlib import Path

import pytest


CONFIG_DIR = Path(__file__).resolve().parents[3] / "config"


def _load(name):
    return json.loads((CONFIG_DIR / name).read_text())


def test_model_profiles_contains_eleven_multilingual_v2():
    p = _load("model_profiles.json")
    assert "eleven_multilingual_v2" in p
    e = p["eleven_multilingual_v2"]
    assert e["provider"] == "elevenlabs"
    assert e["modality"] == "audio_t2a"
    assert "cost_per_1k_chars" in e
    assert "default_voice_settings" in e
    assert e["auth_env_var"] == "ELEVENLABS_API_KEY"


def test_model_profiles_contains_lipsync_2_0():
    p = _load("model_profiles.json")
    assert "lipsync-2.0" in p
    e = p["lipsync-2.0"]
    assert e["provider"] == "sync.so"
    assert e["modality"] == "lipsync_post"
    assert "cost_per_second" in e
    assert e["auth_env_var"] == "SYNC_SO_API_KEY"


def test_provider_strategy_contains_eleven():
    s = _load("provider_strategy.json")
    assert "eleven_multilingual_v2" in s
    assert s["eleven_multilingual_v2"]["primary"] == "elevenlabs"


def test_provider_strategy_contains_sync_so():
    s = _load("provider_strategy.json")
    assert "lipsync-2.0" in s
    assert s["lipsync-2.0"]["primary"] == "sync_so"


def test_get_profile_resolves_eleven():
    from recoil.core.model_profiles import get_profile
    prof = get_profile("eleven_multilingual_v2")
    assert prof["provider"] == "elevenlabs"


def test_get_profile_resolves_lipsync():
    from recoil.core.model_profiles import get_profile
    prof = get_profile("lipsync-2.0")
    assert prof["provider"] == "sync.so"


def test_cost_compute_eleven_via_adapter_helper():
    """The adapter's _compute_cost reads model_profiles. Verify wiring."""
    from recoil.execution.providers.elevenlabs import _compute_cost
    cost = _compute_cost("eleven_multilingual_v2", char_count=1000)
    assert cost > 0  # 1k chars at $0.30/1k = $0.30


def test_cost_compute_lipsync_via_adapter_helper():
    from recoil.execution.providers.sync_so import _compute_cost
    cost = _compute_cost("lipsync-2.0", duration_s=10.0)
    assert cost > 0  # 10s at ~$0.07/s = $0.70


def test_no_other_keys_lost():
    """Sanity: existing entries still present."""
    p = _load("model_profiles.json")
    s = _load("provider_strategy.json")
    for k in ("seeddance-2.0", "kling-o3"):
        assert k in p, f"{k} missing from model_profiles after append"
        assert k in s, f"{k} missing from provider_strategy after append"
