package com.infoepoch.pms.agent.domain.care.stream;

import com.infoepoch.pms.agent.domain.care.model.CareQuery;
import com.infoepoch.pms.agent.domain.care.model.CareTaskType;
import com.infoepoch.pms.agent.domain.care.model.UserProfileSummary;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.StringJoiner;

/**
 * 用户可见文案组装
 */
@Component
public class CareStreamingResponseAssembler {

    /**
     * 将直接回复转换成可直接流式返回的文本片段。
     */
    public List<String> directReplyChunks(String message) {
        return List.of(ensureTrailingLineBreak(message));
    }

    /**
     * 生成通用对话场景的兜底回复。
     */
    public String buildGeneralFallbackReply() {
        return """
                你好，我是精准关爱智能体。
                请换一种说法，或者补充更多信息后再试一次。
                """;
    }

    /**
     * 生成活动推荐场景的标题和开场文案。
     */
    public String buildActivityIntro(CareQuery query) {
        if (query.continuation()) {
            return """
                    ### 活动推荐

                    我继续为你补充更匹配的活动：
                    """;
        }
        return """
                ### 活动推荐

                已为你整理出以下更匹配的活动：
                """;
    }

    /**
     * 生成活动推荐场景的收尾文案。
     */
    public String buildActivityClosing(int deliveredCount, int requestedCount) {
        if (deliveredCount <= 0) {
            return "暂时没有查询到可推荐的活动，建议稍后重试或补充更具体的偏好条件。\n";
        }
        if (deliveredCount < requestedCount) {
            return "\n目前先为你整理到这些更匹配的活动，如需继续收窄偏好，也可以直接告诉我。\n";
        }
        return "\n如需继续推荐更多活动，可以直接说“再来一些”。\n";
    }

    /**
     * 生成用户推荐场景的标题和开场文案。
     */
    public String buildUserIntro(CareQuery query) {
        if (query.continuation()) {
            return """
                    ### 用户推荐

                    我继续为你补充更匹配的用户：
                    """;
        }
        if (StringUtils.hasText(query.activityIntent())) {
            return """
                    ### 用户推荐

                    已为你整理出以下和“%s”更匹配的用户：
                    """.formatted(query.activityIntent());
        }
        return """
                ### 用户推荐

                已为你整理出以下更匹配的用户：
                """;
    }

    /**
     * 把用户列表转换成连续编号的 Markdown 展示文案。
     */
    public List<String> buildUserItems(List<UserProfileSummary> users, int startIndex, CareQuery query) {
        List<String> lines = new ArrayList<>();
        int counter = startIndex;
        for (UserProfileSummary user : users) {
            lines.add(formatUserLine(counter++, user, query));
        }
        return lines;
    }

    /**
     * 生成用户推荐场景的收尾文案。
     */
    public String buildUserClosing(int deliveredCount, int requestedCount) {
        if (deliveredCount <= 0) {
            return "暂时没有整理到符合条件的用户，建议补充更具体的活动描述或筛选条件。\n";
        }
        if (deliveredCount < requestedCount) {
            return "\n目前先为你整理到这些更匹配的用户，如需继续收窄条件，也可以直接告诉我。\n";
        }
        return "\n如需继续补充更多用户，可以直接说“再来一些”。\n";
    }

    /**
     * 生成活动候选为空时的兜底提示。
     */
    public String buildNoActivityDataMessage() {
        return "暂时没有查询到可推荐的活动，建议稍后重试或补充更具体的偏好条件。\n";
    }

    /**
     * 生成按任务类型区分的通用错误文案。
     */
    public String buildGenericErrorMessage(CareTaskType taskType) {
        if (taskType == CareTaskType.RECOMMEND_USERS) {
            return "用户推荐过程中出现异常，请稍后重试。\n";
        }
        if (taskType == CareTaskType.RECOMMEND_ACTIVITIES) {
            return "活动推荐过程中出现异常，请稍后重试。\n";
        }
        return "智能体回复过程中出现异常，请稍后重试。\n";
    }

    /**
     * 生成活动推荐条目为空时的模板化兜底提示。
     */
    public String buildNoActivityTemplate(CareQuery query) {
        return buildActivityIntro(query) + buildNoActivityDataMessage();
    }

    /**
     * 将单个用户格式化成 Markdown 推荐条目。
     */
    private String formatUserLine(int index, UserProfileSummary user, CareQuery query) {
        StringBuilder builder = new StringBuilder();
        builder.append(index)
                .append(". **")
                .append(resolveDisplayName(user))
                .append("**\n");

        String basicInfo = buildUserBasicInfo(user);
        if (StringUtils.hasText(basicInfo)) {
            builder.append("   基本信息：").append(basicInfo).append('\n');
        }
        builder.append("   匹配理由：").append(buildUserReason(user, query)).append('\n');
        if (StringUtils.hasText(user.summary())) {
            builder.append("   补充说明：").append(user.summary()).append('\n');
        }
        builder.append('\n');
        return builder.toString();
    }

    /**
     * 生成用户展示名称。
     */
    private String resolveDisplayName(UserProfileSummary user) {
        if (StringUtils.hasText(user.userName())) {
            return user.userName();
        }
        if (StringUtils.hasText(user.userId())) {
            return "用户" + user.userId();
        }
        return "未命名用户";
    }

    /**
     * 汇总用户基础信息为一行展示文本。
     */
    private String buildUserBasicInfo(UserProfileSummary user) {
        StringJoiner joiner = new StringJoiner(" / ");
        if (user.age() != null) {
            joiner.add(user.age() + "岁");
        }
        if (StringUtils.hasText(user.gender())) {
            joiner.add(user.gender());
        }
        if (StringUtils.hasText(user.region())) {
            joiner.add(user.region());
        }
        return joiner.toString();
    }

    /**
     * 生成用户推荐条目的匹配理由。
     */
    private String buildUserReason(UserProfileSummary user, CareQuery query) {
        List<String> reasonParts = new ArrayList<>();
        String target = StringUtils.hasText(query.activityIntent())
                ? "“" + query.activityIntent() + "”"
                : "当前活动需求";
        reasonParts.add("结合" + target + "的需求，该用户与当前筛选方向较为匹配");
        if (!CollectionUtils.isEmpty(user.interests())) {
            reasonParts.add("兴趣偏好为" + String.join("、", user.interests()));
        }
        if (!CollectionUtils.isEmpty(user.tags())) {
            reasonParts.add("特征标签为" + String.join("、", user.tags()));
        } else if (StringUtils.hasText(user.region())) {
            reasonParts.add("所在区域为" + user.region());
        }
        return String.join("，", reasonParts) + "。";
    }

    /**
     * 确保返回给前端的片段以换行结束，便于连续阅读。
     */
    private String ensureTrailingLineBreak(String message) {
        if (!StringUtils.hasText(message)) {
            return "\n";
        }
        return message.endsWith("\n") ? message : message + "\n";
    }
}
