"""Tempo service unit tests (FASE-1.4)."""

from datetime import datetime
from unittest.mock import MagicMock, patch
from uuid import uuid4

import pytest

from app.domain.exceptions import InvalidOperationError
from app.models.jira_link import JiraLink, JiraLinkEntityType
from app.services import tempo_service


def test_auto_log_test_worklog_skips_when_disabled(monkeypatch, db):
    monkeypatch.setattr("app.services.tempo_service.settings.TEMPO_ENABLED", False)
    test = MagicMock()
    test.id = uuid4()
    user = MagicMock()
    assert tempo_service.auto_log_test_worklog(db, test, user, "red_team_execution") is None


def test_get_tempo_client_raises_when_disabled(monkeypatch):
    monkeypatch.setattr("app.services.tempo_service.settings.TEMPO_ENABLED", False)
    with pytest.raises(InvalidOperationError, match="not enabled"):
        tempo_service.get_tempo_client()


@patch("app.services.tempo_service.log_worklog")
def test_auto_log_test_worklog_calls_tempo(mock_log_worklog, monkeypatch, db, admin_user):
    monkeypatch.setattr("app.services.tempo_service.settings.TEMPO_ENABLED", True)
    mock_log_worklog.return_value = {"id": "wl-1"}

    test_id = uuid4()
    link = JiraLink(
        entity_type=JiraLinkEntityType.test,
        entity_id=test_id,
        jira_issue_key="TST-10",
        jira_issue_id="10010",
        created_by=admin_user.id,
    )
    db.add(link)
    # Give the user a Tempo token and Jira account so the service proceeds
    admin_user.tempo_api_token = "test-tempo-token"
    admin_user.jira_account_id = "jira-account-123"
    db.commit()

    test = MagicMock()
    test.id = test_id
    test.name = "Phishing simulation"
    test.red_started_at = datetime(2026, 5, 18, 10, 0, 0)
    test.updated_at = datetime(2026, 5, 18, 12, 0, 0)
    test.created_at = test.updated_at

    result = tempo_service.auto_log_test_worklog(
        db, test, admin_user, "red_team_execution",
    )

    assert result == {"id": "wl-1"}
    mock_log_worklog.assert_called_once()
    kwargs = mock_log_worklog.call_args.kwargs
    assert kwargs["jira_issue_id"] == 10010
    assert kwargs["time_spent_seconds"] > 0
    assert "[Aegis]" in kwargs["description"]
