"""Tests for preview adapters."""
import os
import tempfile

import pytest

from src.domain.previews.adapters import HTMLAdapter, ReactAdapter, NuxtAdapter, get_adapter


@pytest.mark.asyncio
async def test_html_adapter_enumerate_routes():
    adapter = HTMLAdapter()
    with tempfile.TemporaryDirectory() as tmpdir:
        with open(os.path.join(tmpdir, "index.html"), "w") as f:
            f.write("<html></html>")
        with open(os.path.join(tmpdir, "about.html"), "w") as f:
            f.write("<html></html>")

        routes = await adapter.enumerate_routes(tmpdir)
        assert "routes" in routes
        assert "source" in routes
        assert routes["source"] == "html_adapter"
        paths = [r["path"] for r in routes["routes"]]
        assert "/" in paths
        assert "/about.html" in paths


@pytest.mark.asyncio
async def test_html_adapter_install_deps_noop():
    adapter = HTMLAdapter()
    result = await adapter.install_deps("/tmp/fake")
    assert result == "/tmp/fake"


@pytest.mark.asyncio
async def test_html_adapter_build_noop():
    adapter = HTMLAdapter()
    result = await adapter.build("/tmp/fake")
    assert result == "/tmp/fake"


@pytest.mark.asyncio
async def test_react_adapter_enumerate_routes():
    adapter = ReactAdapter()
    with tempfile.TemporaryDirectory() as tmpdir:
        pages_dir = os.path.join(tmpdir, "src", "pages")
        os.makedirs(pages_dir)
        with open(os.path.join(pages_dir, "Home.tsx"), "w") as f:
            f.write("export default function Home() {}")
        with open(os.path.join(pages_dir, "About.tsx"), "w") as f:
            f.write("export default function About() {}")

        routes = await adapter.enumerate_routes(tmpdir)
        paths = [r["path"] for r in routes["routes"]]
        assert "/" in paths
        assert "/about" in paths


@pytest.mark.asyncio
async def test_nuxt_adapter_enumerate_routes():
    adapter = NuxtAdapter()
    with tempfile.TemporaryDirectory() as tmpdir:
        pages_dir = os.path.join(tmpdir, "pages")
        os.makedirs(pages_dir)
        with open(os.path.join(pages_dir, "index.vue"), "w") as f:
            f.write("<template></template>")
        with open(os.path.join(pages_dir, "contact.vue"), "w") as f:
            f.write("<template></template>")

        routes = await adapter.enumerate_routes(tmpdir)
        paths = [r["path"] for r in routes["routes"]]
        assert "/" in paths
        assert "/contact" in paths


def test_get_adapter_react():
    adapter = get_adapter("react_app")
    assert adapter.adapter_name == "react_adapter"


def test_get_adapter_nuxt():
    adapter = get_adapter("nuxt_app")
    assert adapter.adapter_name == "nuxt_adapter"


def test_get_adapter_html():
    adapter = get_adapter("html")
    assert adapter.adapter_name == "html_adapter"


def test_get_adapter_invalid():
    with pytest.raises(ValueError, match="No preview adapter"):
        get_adapter("wordpress_theme")
