"""Tests for the Tech Tools plugin.

The plugin owns no API and no tables, so the whole backend contract is: it
loads, it advertises one nav entry, and it claims no database. That last part
matters - a plugin that accidentally returns models would pull the tools
section into the migration and prune-schema machinery it has no business in.
"""

import json
import os

from plugins.tools.plugin import ToolsPlugin


PLUGIN_DIR = os.path.join(os.path.dirname(os.path.dirname(
    os.path.dirname(os.path.abspath(__file__)))), 'plugins', 'tools')


def test_meta_matches_manifest():
    """The manifest is the single source of truth per ADR-002."""
    with open(os.path.join(PLUGIN_DIR, 'manifest.json'), encoding='utf-8') as handle:
        manifest = json.load(handle)

    meta = ToolsPlugin().meta
    assert meta.name == manifest['name']
    assert meta.version == manifest['version']
    assert meta.core_version == manifest['core_version']


def test_no_backend_surface():
    """Client-side only: no blueprint to register, no tables to migrate."""
    plugin = ToolsPlugin()
    assert plugin.get_blueprint() is None
    assert plugin.get_models() == []


def test_navigation_item():
    items = ToolsPlugin().get_navigation_items()
    assert len(items) == 1
    item = items[0]
    assert item['name'] == 'Tech Tools'
    assert item['route'] == '/tools'
    # The icon has to exist in AppLayout's iconMap or the nav entry renders
    # with no glyph.
    assert item['icon'] == 'wrench'


def test_nav_icon_is_mapped_in_the_frontend():
    """Guard the one cross-file coupling: nav icon name -> AppLayout iconMap."""
    layout = os.path.join(os.path.dirname(PLUGIN_DIR), '..', 'frontend', 'src',
                          'views', 'AppLayout.vue')
    with open(os.path.normpath(layout), encoding='utf-8') as handle:
        source = handle.read()
    for item in ToolsPlugin().get_navigation_items():
        assert f"'{item['icon']}':" in source
