package dev.sonpx.loyalty.agent.core.classifier;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

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

/**
 * Tests for IntentClassifier — verifying Vietnamese keyword matching
 * for all intent categories.
 */
class IntentClassifierTest {

    private IntentClassifier classifier;

    @BeforeEach
    void setUp() {
        classifier = new IntentClassifier();
    }

    // ========== CONVERSATION ==========

    @ParameterizedTest
    @ValueSource(strings = {
            "xin chào",
            "Chào bạn",
            "hi",
            "Hello",
            "bạn là ai",
            "cảm ơn",
            "ok",
            "bye"
    })
    @DisplayName("Should classify greetings as CONVERSATION")
    void shouldClassifyGreetings(String input) {
        assertEquals(Intent.CONVERSATION, classifier.classify(input));
    }

    // ========== CAMPAIGN QUERY ==========

    @ParameterizedTest
    @ValueSource(strings = {
            "danh sách chiến dịch",
            "Tìm chiến dịch ABC",
            "xem chiến dịch",
            "liệt kê campaign",
            "có bao nhiêu chiến dịch",
            "chiến dịch nào đang chạy",
            "chi tiết campaign CMP01",
            "campaign"
    })
    @DisplayName("Should classify campaign queries as CAMPAIGN_QUERY")
    void shouldClassifyCampaignQuery(String input) {
        assertEquals(Intent.CAMPAIGN_QUERY, classifier.classify(input));
    }

    // ========== RULE QUERY ==========

    @ParameterizedTest
    @ValueSource(strings = {
            "danh sách rule",
            "tìm thể lệ",
            "xem quy tắc",
            "thể lệ chiến dịch ABC",
            "công thức thưởng",
            "cách tính điểm",
            "điều kiện thưởng"
    })
    @DisplayName("Should classify rule queries as RULE_QUERY")
    void shouldClassifyRuleQuery(String input) {
        assertEquals(Intent.RULE_QUERY, classifier.classify(input));
    }

    // ========== CAMPAIGN CREATE ==========

    @ParameterizedTest
    @ValueSource(strings = {
            "tạo chiến dịch mới",
            "thêm campaign",
            "tạo mới chiến dịch",
            "add campaign"
    })
    @DisplayName("Should classify campaign creation as CAMPAIGN_CREATE")
    void shouldClassifyCampaignCreate(String input) {
        assertEquals(Intent.CAMPAIGN_CREATE, classifier.classify(input));
    }

    // ========== RULE CREATE ==========

    @ParameterizedTest
    @ValueSource(strings = {
            "tạo rule thưởng",
            "thêm thể lệ mới",
            "tạo mới quy tắc",
            "add rule"
    })
    @DisplayName("Should classify rule creation as RULE_CREATE")
    void shouldClassifyRuleCreate(String input) {
        assertEquals(Intent.RULE_CREATE, classifier.classify(input));
    }

    // ========== UNKNOWN ==========

    @ParameterizedTest
    @ValueSource(strings = {
            "thời tiết hôm nay",
            "abc xyz",
            "123456"
    })
    @DisplayName("Should classify unrecognized prompts as UNKNOWN")
    void shouldClassifyUnknown(String input) {
        assertEquals(Intent.UNKNOWN, classifier.classify(input));
    }

    // ========== EDGE CASES ==========

    @Test
    @DisplayName("Should handle null input as CONVERSATION")
    void shouldHandleNull() {
        assertEquals(Intent.CONVERSATION, classifier.classify(null));
    }

    @Test
    @DisplayName("Should handle empty input as CONVERSATION")
    void shouldHandleEmpty() {
        assertEquals(Intent.CONVERSATION, classifier.classify(""));
    }

    @Test
    @DisplayName("Should handle whitespace input as CONVERSATION")
    void shouldHandleWhitespace() {
        assertEquals(Intent.CONVERSATION, classifier.classify("   "));
    }

    @Test
    @DisplayName("CREATE should have higher priority than QUERY")
    void shouldPrioritizeCreateOverQuery() {
        // "tạo chiến dịch" matches both CREATE and QUERY patterns
        // CREATE should win because it's checked first
        assertEquals(Intent.CAMPAIGN_CREATE, classifier.classify("tạo chiến dịch mới"));
        assertEquals(Intent.RULE_CREATE, classifier.classify("tạo rule mới"));
    }
}
