from __future__ import annotations

import pytest
from fastapi import HTTPException

from src.api.v1.platform import operator_runs
from src.core.awooop_operator_auth import (
    AwoooPOperatorPrincipal,
    authenticate_awooop_operator_headers,
)


def test_operator_auth_rejects_missing_key_in_prod() -> None:
    with pytest.raises(HTTPException) as exc:
        authenticate_awooop_operator_headers(
            operator_id="ops@example.com",
            operator_key=None,
            configured_key="",
            environment="prod",
        )

    assert exc.value.status_code == 401


def test_operator_auth_rejects_invalid_key() -> None:
    with pytest.raises(HTTPException) as exc:
        authenticate_awooop_operator_headers(
            operator_id="ops@example.com",
            operator_key="wrong",
            configured_key="expected",
            environment="prod",
        )

    assert exc.value.status_code == 401


def test_operator_auth_returns_principal_for_valid_key() -> None:
    principal = authenticate_awooop_operator_headers(
        operator_id="telegram:123456",
        operator_key="expected",
        configured_key="expected",
        environment="prod",
    )

    assert principal == AwoooPOperatorPrincipal(
        operator_id="telegram:123456",
        auth_method="operator_api_key",
    )


def test_operator_auth_rejects_malformed_identity() -> None:
    with pytest.raises(HTTPException) as exc:
        authenticate_awooop_operator_headers(
            operator_id="../operator",
            operator_key="expected",
            configured_key="expected",
            environment="prod",
        )

    assert exc.value.status_code == 422


@pytest.mark.asyncio
async def test_decide_approval_uses_trusted_principal_not_body(
    monkeypatch: pytest.MonkeyPatch,
) -> None:
    captured: dict[str, object] = {}

    async def fake_decide_approval_svc(**kwargs: object) -> dict[str, object]:
        captured.update(kwargs)
        return {
            "run_id": kwargs["run_id"],
            "decision": kwargs["decision"],
            "new_state": "running",
            "approval_token_jti": "jti-test",
        }

    monkeypatch.setattr(
        operator_runs,
        "decide_approval_svc",
        fake_decide_approval_svc,
    )

    body = operator_runs.DecideApprovalRequest(
        project_id="awoooi",
        decision="approve",
        approver_id="spoofed-browser-value",
    )
    principal = AwoooPOperatorPrincipal(
        operator_id="telegram:123456",
        auth_method="operator_api_key",
    )

    response = await operator_runs.decide_approval(
        "018f2d04-4c37-7a18-b764-df0df0cbe111",
        body,
        principal,
    )

    assert response["approval_token_jti"] == "jti-test"
    assert captured["approver_id"] == "telegram:123456"
    assert captured["project_id"] == "awoooi"
