package dev.sonpx.loyalty.mcp.tool;

import dev.sonpx.loyalty.mcp.model.OperationResult;
import dev.sonpx.loyalty.mcp.model.Result;
import dev.sonpx.loyalty.mcp.reward.criteria.CampaignRuleCriteria;
import dev.sonpx.loyalty.mcp.reward.dto.CampaignRuleSummaryDto;
import dev.sonpx.loyalty.mcp.reward.model.CampaignRule;
import dev.sonpx.loyalty.mcp.service.CampaignRuleService;
import dev.sonpx.loyalty.mcp.util.SearchUtils;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.ai.mcp.annotation.McpTool;
import org.springframework.stereotype.Component;

/**
 * Created by SonPhung on Monday, 20-Jul-2026
 */
@Component
@RequiredArgsConstructor
public class CampaignRuleTools {

    private final CampaignRuleService campaignRuleService;

    @McpTool(description = """
            TÌM KIẾM THỂ LỆ / RULE của chiến dịch. Trả về: tên rule, loại rule, chiến dịch gốc, công thức thưởng.
            - Param `search` (String): từ khóa tìm kiếm theo tên hoặc mã rule cụ thể.
            - QUAN TRỌNG: Khi người dùng hỏi lấy danh sách chung ("danh sách rule", "xem thể lệ"), KHÔNG truyền param `search` (để null hoặc rỗng ""). Tuyệt đối KHÔNG truyền các từ chung như "rule", "thể lệ", "danh sách" vào `search`.
            - KHÔNG dùng tool này khi người dùng chỉ hỏi về thông tin cơ bản chiến dịch (tên, owner, loại) → hãy dùng tool searchCampaigns.
            Hiển thị tối đa 10 bản ghi.""")
    public Result<List<CampaignRuleSummaryDto>> searchRules(String search) {
        CampaignRuleCriteria criteria = new CampaignRuleCriteria();
        criteria.setSearch(SearchUtils.sanitizeSearch(search));
        return campaignRuleService.getAll(criteria);
    }


    @McpTool(description = "Đếm số lượng RULE/THỂ LỆ, không phải chiến dịch. Để search = null nếu đếm tất cả.")
    public Result<Long> countRules(String search) {
        CampaignRuleCriteria criteria = new CampaignRuleCriteria();
        criteria.setSearch(SearchUtils.sanitizeSearch(search));
        return campaignRuleService.count(criteria);
    }

    @McpTool(description = "Lấy chi tiết MỘT RULE/THỂ LỆ theo ID. Bao gồm: công thức thưởng, giới hạn, lịch trình.")
    public Result<CampaignRule> getRuleById(String id) {
        return campaignRuleService.findActiveById(id);
    }

    @McpTool(description = "Lấy thông tin NHIỀU RULE/THỂ LỆ theo danh sách ID, phân tách bằng dấu phẩy.")
    public Result<List<CampaignRule>> getRulesByIds(String ids) {
        return campaignRuleService.findActiveByIds(ids);
    }

    @McpTool(description = "Tạo một MÃ RULE mới (rule ID), không phải mã chiến dịch.")
    public Result<String> generateRuleId() {
        return campaignRuleService.generateId();
    }

    @McpTool(description = "Kiểm tra tính hợp lệ của một MÃ RULE (rule ID).")
    public Result<String> checkRuleId(String id) {
        return campaignRuleService.checkId(id);
    }

    @McpTool(description = "Tạo một RULE/THỂ LỆ mới cho chiến dịch. Cần có campaignId để liên kết.")
    public Result<OperationResult<CampaignRule>> createRule(CampaignRule dto) {
        return campaignRuleService.create(dto);
    }
}
