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

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

/**
 * Rule-based intent classifier for Vietnamese Loyalty domain.
 * Uses keyword/regex matching — zero LLM calls, zero latency.
 *
 * Pattern priority: CREATE > QUERY > CONVERSATION > UNKNOWN
 * LinkedHashMap preserves insertion order for priority matching.
 */
@Slf4j
@Component
public class IntentClassifier {

    private static final Map<Intent, List<Pattern>> PATTERNS = new LinkedHashMap<>();

    static {
        // CREATE intents first (higher priority than query)
        PATTERNS.put(Intent.RULE_CREATE, List.of(
                Pattern.compile("(?i)(tạo|thêm|add|tạo mới|thêm mới|setup|cấu hình mới)\\s*.*(rule|thể lệ|quy tắc|quy chế)"),
                Pattern.compile("(?i)(rule|thể lệ|quy tắc)\\s*.*(tạo|thêm|mới)")
        ));

        PATTERNS.put(Intent.CAMPAIGN_CREATE, List.of(
                Pattern.compile("(?i)(tạo|thêm|add|tạo mới|thêm mới|setup)\\s*.*(chiến dịch|campaign)"),
                Pattern.compile("(?i)(chiến dịch|campaign)\\s*.*(tạo|thêm|mới)")
        ));

        // QUERY intents
        PATTERNS.put(Intent.RULE_QUERY, List.of(
                Pattern.compile("(?i)(danh sách|tìm|xem|liệt kê|có bao nhiêu|mấy|đếm|show|list)\\s*.*(rule|thể lệ|quy tắc|quy chế)"),
                Pattern.compile("(?i)(rule|thể lệ|quy tắc|quy chế)\\s*.*(nào|gì|nào đó|chi tiết|detail)"),
                Pattern.compile("(?i)(thể lệ|rule|quy tắc|điều kiện|công thức thưởng|cách tính điểm|cách tính thưởng)"),
                Pattern.compile("(?i)(chi tiết|detail|thông tin)\\s*.*(rule|thể lệ)")
        ));

        PATTERNS.put(Intent.CAMPAIGN_QUERY, List.of(
                Pattern.compile("(?i)(danh sách|tìm|xem|liệt kê|có bao nhiêu|mấy|đếm|show|list)\\s*.*(chiến dịch|campaign)"),
                Pattern.compile("(?i)(chiến dịch|campaign)\\s*.*(nào|gì|nào đó|chi tiết|detail)"),
                Pattern.compile("(?i)(chi tiết|detail|thông tin)\\s*.*(chiến dịch|campaign)"),
                Pattern.compile("(?i)(campaign|chiến dịch)")
        ));

        // CONVERSATION intents (lowest priority)
        PATTERNS.put(Intent.CONVERSATION, List.of(
                Pattern.compile("(?i)^\\s*(xin chào|chào bạn|chào|hi|hello|hey|cảm ơn|thanks|thank you|bạn là ai|bạn là gì|giúp gì|help|hướng dẫn|bạn có thể|bạn làm được gì)"),
                Pattern.compile("(?i)^\\s*(ok|oke|được|tốt|cảm ơn bạn|bye|tạm biệt|goodbye)\\s*[.!?]*$")
        ));
    }

    /**
     * Classify user prompt into an Intent.
     * Returns UNKNOWN if no pattern matches (will fallback to SimpleAgent with tools).
     */
    public Intent classify(String prompt) {
        if (prompt == null || prompt.isBlank()) {
            return Intent.CONVERSATION;
        }

        String trimmed = prompt.trim();

        for (Map.Entry<Intent, List<Pattern>> entry : PATTERNS.entrySet()) {
            for (Pattern pattern : entry.getValue()) {
                if (pattern.matcher(trimmed).find()) {
                    log.debug("Classified prompt as {} using pattern: {}", entry.getKey(), pattern.pattern());
                    return entry.getKey();
                }
            }
        }

        log.debug("No pattern matched for prompt, returning UNKNOWN");
        return Intent.UNKNOWN;
    }
}
