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.CampaignCriteria;
import dev.sonpx.loyalty.mcp.reward.dto.CampaignSummaryDto;
import dev.sonpx.loyalty.mcp.reward.model.Campaign;
import dev.sonpx.loyalty.mcp.service.CampaignService;
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 CampaignTools {

    private final CampaignService campaignService;

    @McpTool(description = """
            TÌM KIẾM CHIẾN DỊCH (Campaign). Trả về thông tin CƠ BẢN của chiến dịch: tên, mã, owner, loại, thời gian.
            - Param `search` (String): từ khóa tìm kiếm theo tên hoặc mã chiến dịch cụ thể.
            - QUAN TRỌNG: Khi người dùng hỏi lấy danh sách chung ("danh sách chiến dịch", "xem các chiến dịch"), KHÔNG truyền param `search` (để null hoặc rỗng ""). Tuyệt đối KHÔNG truyền các từ chung như "chiến dịch", "danh sách", "campaign" vào `search`.
            - KHÔNG dùng tool này khi người dùng hỏi về: rule, thể lệ, quy tắc, điều kiện, công thức thưởng → hãy dùng tool searchRules.""")
    public Result<List<CampaignSummaryDto>> searchCampaigns(String search) {
        CampaignCriteria criteria = new CampaignCriteria();
        criteria.setSearch(SearchUtils.sanitizeSearch(search));
        return campaignService.getAll(criteria);
    }


    @McpTool(description = "Đếm số lượng CHIẾN DỊCH (Campaign), không phải rule. Để search = null nếu đếm tất cả.")
    public Result<Long> countCampaigns(String search) {
        CampaignCriteria criteria = new CampaignCriteria();
        criteria.setSearch(SearchUtils.sanitizeSearch(search));
        return campaignService.count(criteria);
    }

    @McpTool(description = "Lấy chi tiết MỘT CHIẾN DỊCH theo ID. Trả về thông tin cơ bản của chiến dịch, KHÔNG bao gồm rule/thể lệ.")
    public Result<Campaign> getCampaignById(String id) {
        return campaignService.findActiveById(id);
    }

    @McpTool(description = "Lấy thông tin NHIỀU CHIẾN DỊCH theo danh sách ID, phân tách bằng dấu phẩy. Không bao gồm rule.")
    public Result<List<Campaign>> getCampaignsByIds(String ids) {
        return campaignService.findActiveByIds(ids);
    }

    @McpTool(description = "Tạo một MÃ CHIẾN DỊCH mới (campaign ID), không phải mã rule.")
    public Result<String> generateCampaignId() {
        return campaignService.generateId();
    }

    @McpTool(description = "Kiểm tra tính hợp lệ của một MÃ CHIẾN DỊCH (campaign ID).")
    public Result<String> checkCampaignId(String id) {
        return campaignService.checkId(id);
    }

    @McpTool(description = "Tạo một CHIẾN DỊCH mới (Campaign). Sau khi tạo xong, cần thêm rule/thể lệ bằng tool createRule.")
    public Result<OperationResult<Campaign>> createCampaign(Campaign dto) {
        return campaignService.create(dto);
    }
}
