package com.example.demo;

import com.example.demo.model.TaskDraft;
import com.example.demo.service.TaskGenerationService;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.*;

/**
 * 任务生成服务单元测试。
 * <p>
 * 测试任务草案生成、发送与重试机制。
 * </p>
 *
 * @requirement(name="任务模板匹配与生成", id="SRS-EHTG-06")
 * @requirement(name="任务草案发送与重试机制", id="SRS-EHTG-07")
 */
@SpringBootTest
class TaskGenerationServiceTest {

    @Autowired
    private TaskGenerationService taskGenerationService;

    @Test
    @DisplayName("测试基于事件生成任务草案")
    void testGenerateTaskDraft() {
        // EVT-002 是 CRITICAL 威胁 + 高置信度，应能触发任务生成
        TaskDraft draft = taskGenerationService.generateTaskDraft("EVT-002");
        assertNotNull(draft);
        assertNotNull(draft.getDraftId());
        assertNotNull(draft.getTitle());
        assertTrue(draft.getTargetValueScore() > 200);
        assertEquals(0, draft.getSendStatus());
    }

    @Test
    @DisplayName("测试低价值事件不会生成任务草案")
    void testGenerateTaskDraftLowValue() {
        // EVT-004 是 LOW 威胁 + 低置信度，应无法触发任务生成
        assertThrows(IllegalArgumentException.class, () -> {
            taskGenerationService.generateTaskDraft("EVT-004");
        });
    }

    @Test
    @DisplayName("测试发送任务草案")
    void testSendTaskDraft() {
        TaskDraft draft = taskGenerationService.generateTaskDraft("EVT-001");
        boolean result = taskGenerationService.sendTaskDraft(draft.getDraftId());
        assertTrue(result);
    }

    @Test
    @DisplayName("测试重试发送失败的任务草案")
    void testRetrySendDraft() {
        TaskDraft draft = taskGenerationService.generateTaskDraft("EVT-005");
        // 先发送
        taskGenerationService.sendTaskDraft(draft.getDraftId());
        // 对于已成功发送的草案，重试应返回 false（无需重试）
        boolean retryResult = taskGenerationService.retrySendDraft(draft.getDraftId());
        assertFalse(retryResult);
    }
}
