from types import SimpleNamespace

import pytest
from fastapi import HTTPException


@pytest.mark.parametrize(
    ("raw", "expected"),
    [("0/0/1", "0/0/1"), ("GPON 0/0/1", "0/0/1"), ("1", "0/0/1")],
)
def test_cdata_pon_input_normalization(raw, expected):
    from app.core.cdata_fd1601s_discovery import normalize_pon_port

    assert normalize_pon_port(raw) == expected


@pytest.mark.parametrize("raw", ["", "1;show running-config", "1/1/1\nfoo", "1/1/1 --all"])
def test_cdata_pon_input_rejects_command_like_values(raw):
    from app.core.cdata_fd1601s_discovery import InvalidPonPortError, normalize_pon_port

    with pytest.raises(InvalidPonPortError):
        normalize_pon_port(raw)


def test_cdata_discovery_is_fail_closed_without_a_pinned_host_key():
    from app.core.cdata_fd1601s_discovery import (
        DiscoveryUnavailableError,
        discover_unregistered_onts,
    )

    with pytest.raises(DiscoveryUnavailableError, match="host key"):
        discover_unregistered_onts(
            host="192.0.2.1", port=22, username="readonly", encrypted_secret="unused",
            pinned_host_key=None, pon_port="0/0/1",
        )


@pytest.mark.asyncio
async def test_auto_sn_api_validates_olt_and_returns_no_results_when_not_ready():
    from app.routes.customers import auto_sn_discovery

    class FakeDB:
        async def get(self, model, device_id):
            assert device_id == 7
            return SimpleNamespace(
                id=7,
                name="OLT-TERNATE-01",
                vendor="C-DATA",
                model="FD1601S-B1",
                is_active=True,
                credential_id=None,
            )

    response = await auto_sn_discovery(7, "GPON 0/0/1", FakeDB())

    assert response.status_code == 503
    assert response.body == (
        b'{"available":false,"results":[],"olt_device_id":7,"pon_port":"0/0/1",'
        b'"reason":"Credential Vault OLT belum terikat."}'
    )


@pytest.mark.asyncio
async def test_auto_sn_api_rejects_a_non_cdata_fd1601s_olt():
    from app.routes.customers import auto_sn_discovery

    class FakeDB:
        async def get(self, model, device_id):
            return SimpleNamespace(id=device_id, vendor="ZTE", model="C320", is_active=True)

    with pytest.raises(HTTPException) as exc:
        await auto_sn_discovery(7, "0/0/1", FakeDB())

    assert exc.value.status_code == 409
