package dev.sonpx.loyalty.mcp.service;

import dev.sonpx.loyalty.mcp.model.OperationResult;
import dev.sonpx.loyalty.mcp.model.Result;
import dev.sonpx.loyalty.mcp.reward.client.CampaignClient;
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 java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

/**
 * Created by SonPhung on Monday, 20-Jul-2026
 */
@Service
@Slf4j
@RequiredArgsConstructor
public class CampaignService {

    private final CampaignClient campaignClient;

    public Result<List<CampaignSummaryDto>> getAll(CampaignCriteria criteria) {
        List<Campaign> campaigns = campaignClient.getAll(criteria, Pageable.ofSize(5));
        List<CampaignSummaryDto> summaries = campaigns != null
                ? campaigns.stream().map(this::toSummaryDto).toList()
                : List.of();
        return Result.of(summaries, """
                Trả lời tự nhiên bằng tiếng Việt. Không dùng markdown table.
                Hiển thị mỗi chiến dịch theo dạng danh sách đánh số:
                  **[Tên]** (`[campaignId]`) — Owner: [ownerName hoặc "Chưa có"], Loại: [campaignType], Hiệu lực: [effectiveFrom] → [effectiveTo], Số rule: [numOfRule]
                  Mô tả: [description, tóm tắt nếu quá dài, hoặc "Chưa có"]
                Nếu không tìm thấy kết quả, thông báo nhẹ nhàng và gợi ý thử từ khóa khác.
                Luôn kết thúc bằng câu gợi mở hướng dẫn người dùng bước tiếp theo (ví dụ: xem chi tiết, xem rule, tạo mới).
                """);
    }

    public CampaignSummaryDto toSummaryDto(Campaign campaign) {
        if (campaign == null) {
            return null;
        }
        return CampaignSummaryDto.builder()
                .campaignId(campaign.getCampaignId())
                .name(campaign.getName())
                .ownerName(campaign.getOwnerName())
                .campaignType(campaign.getCampaignType())
                .effectiveFrom(campaign.getEffectiveFrom())
                .effectiveTo(campaign.getEffectiveTo())
                .numOfRule(campaign.getNumOfRule())
                .description(campaign.getDescription())
                .build();
    }

    public Result<Long> count(CampaignCriteria criteria) {
        Long count = campaignClient.count(criteria);
        return Result.of(count, """
                Trả lời tự nhiên bằng tiếng Việt. Ví dụ: "Hiện tại có [count] chiến dịch [phù hợp với điều kiện tìm kiếm]."
                Nếu count = 0, gợi ý người dùng thử từ khóa khác hoặc tạo chiến dịch mới.
                """);
    }

    public Result<Campaign> findActiveById(String id) {
        Campaign campaign = campaignClient.findActiveById(id);
        return Result.of(campaign, """
                Trả lời tự nhiên bằng tiếng Việt. Trình bày thông tin chi tiết của chiến dịch một cách rõ ràng:
                - Tên, Mã ID, Loại chiến dịch, Owner
                - Thời gian hiệu lực (từ ngày → đến ngày)
                - Mô tả (nếu có)
                - Số lượng rule, Khách hàng mục tiêu, Target ATV (nếu có)
                - Trạng thái, Người cập nhật cuối
                Dùng bullet list hoặc dạng key-value dễ đọc, KHÔNG dùng table.
                Gợi ý người dùng có thể xem danh sách rule của chiến dịch này.
                """);
    }

    public Result<List<Campaign>> findActiveByIds(String ids) {
        List<String> idList = java.util.Arrays.asList(ids.split(",\\s*"));
        List<Campaign> campaigns = campaignClient.findActiveByIds(idList);
        return Result.of(campaigns, """
                Trả lời tự nhiên bằng tiếng Việt. Hiển thị danh sách chiến dịch theo dạng đánh số,
                mỗi chiến dịch ghi: Tên, Mã ID, Thời gian hiệu lực, Trạng thái.
                Không dùng markdown table. Tóm tắt ngắn gọn nếu danh sách dài.
                """);
    }

    public Result<String> generateId() {
        String id = campaignClient.generateId();
        return Result.of(id, """
                Trả lời tự nhiên bằng tiếng Việt. Ví dụ: "Mã chiến dịch mới đã được tạo: `[id]`."
                Gợi ý người dùng có thể dùng mã này để tạo chiến dịch mới.
                """);
    }

    public Result<String> checkId(String id) {
        String checkResult = campaignClient.checkId(id);
        return Result.of(checkResult, """
                Trả lời tự nhiên bằng tiếng Việt. Giải thích kết quả kiểm tra mã chiến dịch:
                - Nếu hợp lệ/khả dụng: thông báo tích cực, gợi ý tạo chiến dịch.
                - Nếu đã tồn tại/không hợp lệ: thông báo rõ ràng lý do, gợi ý tạo mã mới.
                """);
    }

    public Result<OperationResult<Campaign>> create(Campaign dto) {
        OperationResult<Campaign> opResult = campaignClient.create(dto);
        return Result.of(opResult, """
                Trả lời tự nhiên bằng tiếng Việt.
                - Nếu thành công: chúc mừng người dùng, hiển thị tóm tắt chiến dịch vừa tạo (Tên, ID, Thời gian, Loại), gợi ý bước tiếp theo (thêm rule, cấu hình thể lệ).
                - Nếu lỗi: thông báo lỗi rõ ràng, giải thích nguyên nhân nếu có, gợi ý cách khắc phục.
                """);
    }
}

