"""Unit tests for webhook filtering and idempotency helpers."""

from packages.db.models import WorkflowState
from packages.integrations.jira_webhook import (
    is_agent_ready,
    normalize_jira_webhook,
    should_resume_clarification,
    should_start_run,
    validate_webhook_signature,
)


def _issue_payload(**overrides):
    issue = {
        "key": "SALES-101",
        "fields": {
            "project": {"key": "SALES"},
            "status": {"name": "Ready for Agent"},
            "issuetype": {"name": "Story"},
            "labels": ["agent-nova"],
            "summary": "Test",
        },
    }
    payload = {"webhookEvent": "jira:issue_created", "issue": issue}
    payload.update(overrides)
    return payload


def test_normalize_and_ready(artifacts_tmpdir):
    event = normalize_jira_webhook(_issue_payload(), "del-1")
    assert event.jira_key == "SALES-101"
    assert should_start_run(event) is True
    assert is_agent_ready(event) is True


def test_not_ready_without_label_or_status(artifacts_tmpdir):
    payload = _issue_payload()
    payload["issue"]["fields"]["labels"] = []
    payload["issue"]["fields"]["status"]["name"] = "To Do"
    event = normalize_jira_webhook(payload, "del-2")
    assert should_start_run(event) is False


def test_resume_clarification(artifacts_tmpdir):
    payload = {
        "webhookEvent": "comment_created",
        "issue": {
            "key": "SALES-102",
            "fields": {
                "project": {"key": "SALES"},
                "status": {"name": "Ready for Agent"},
                "issuetype": {"name": "Story"},
                "labels": ["agent-nova"],
            },
        },
        "comment": {
            "author": {"accountId": "human-1"},
            "body": "Here are the acceptance criteria...",
        },
    }
    event = normalize_jira_webhook(payload, "del-3")
    assert should_resume_clarification(event, WorkflowState.NEEDS_CLARIFICATION) is True
    assert should_resume_clarification(event, WorkflowState.ANALYZING) is False


def test_signature_validation():
    body = b'{"ok":true}'
    assert validate_webhook_signature(body, None, "secret") is True
    import hashlib
    import hmac

    digest = hmac.new(b"secret", body, hashlib.sha256).hexdigest()
    assert validate_webhook_signature(body, f"sha256={digest}", "secret") is True
    assert validate_webhook_signature(body, "sha256=deadbeef", "secret") is False
