from __future__ import annotations

import json
import tempfile
import unittest
from pathlib import Path

from kimu.db import connect, initialise
from kimu.tool_runtime import provider_tools


class Increment45CompletionTests(unittest.TestCase):
    def test_increment_45_schema_supports_completed_workflows(self):
        with tempfile.TemporaryDirectory() as directory:
            database = Path(directory) / "kimu.sqlite3"
            initialise(database)
            db = connect(database)
            tables = {row[0] for row in db.execute("SELECT name FROM sqlite_master WHERE type='table'")}
            required = {"tool_policies", "tool_agent_sessions", "tool_agent_steps", "website_diffs", "swarm_approvals"}
            self.assertTrue(required.issubset(tables), sorted(required - tables))
            swarm_columns = {row[1] for row in db.execute("PRAGMA table_info(swarms)")}
            self.assertTrue({"approval_mode", "max_parallelism", "max_tokens", "used_tokens"}.issubset(swarm_columns))
            website_columns = {row[1] for row in db.execute("PRAGMA table_info(website_projects)")}
            self.assertTrue({"wizard_stage", "theme_json"}.issubset(website_columns))
            operation_columns = {row[1] for row in db.execute("PRAGMA table_info(tool_operations)")}
            self.assertIn("parent_session_id", operation_columns)
            db.close()

    def test_provider_tool_contract_is_valid_function_schema(self):
        tools = provider_tools()
        self.assertGreaterEqual(len(tools), 9)
        self.assertTrue(all(tool.get("type") == "function" for tool in tools))
        for tool in tools:
            function = tool.get("function") or {}
            self.assertTrue(function.get("name"))
            self.assertEqual((function.get("parameters") or {}).get("type"), "object")

    def test_completed_feature_source_contract(self):
        root = Path(__file__).resolve().parents[1]
        advanced = (root / "src/kimu/advanced.py").read_text(encoding="utf-8")
        gateway = (root / "src/kimu/conversation_gateway.py").read_text(encoding="utf-8")
        client = (root / "frontend/src/conversation-client.js").read_text(encoding="utf-8")
        main = (root / "frontend/src/main.jsx").read_text(encoding="utf-8")
        expected_advanced = [
            "tool-agent/sessions", "complete_together", "provider_tools", "tool_policies",
            "website_diffs", "manifest.webmanifest", "serviceWorker.register", "repair.iteration",
            "VERDICT: FAIL", "swarm_approvals", "max_parallelism", "max_tokens",
        ]
        for phrase in expected_advanced:
            self.assertIn(phrase, advanced)
        for phrase in ["transcription_session.updated", "tts_session.updated", "context.cancel", "input_text_buffer.clear", "barge_in"]:
            self.assertIn(phrase, gateway)
        for phrase in ["session.update", "clearAudio", "barge_in"]:
            self.assertIn(phrase, client)
        for phrase in ["AI tool agent", "wizard-steps", "Unified changes", "approval_mode", "max_parallelism"]:
            self.assertIn(phrase, main)

    def test_model_and_audio_feature_locks_remain_fixed(self):
        root = Path(__file__).resolve().parents[1]
        locks = json.loads((root / "config/feature-locks.json").read_text(encoding="utf-8"))
        payload = json.dumps(locks)
        self.assertIn("moonshotai/Kimi-K2.6", payload)
        self.assertIn("Kimi K2.7 Coder", payload)
        self.assertIn("openai/whisper-large-v3", payload)
        self.assertIn("cartesia/sonic-3", payload)
        self.assertIn("true barge-in", payload)


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