package com.ylx.order.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ylx.order.domain.CommentUserAudit;

import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 用户评论审核服务接口
 * <p>
 * 提供用户评论审核功能的业务接口，包括审核通过、审核拒绝等操作。
 * 继承自 MyBatis-Plus 的 IService 接口，提供基础的 CRUD 操作。
 * </p>
 *
 * @author ylx
 * @version 1.0
 * @since 2024
 */
public interface TCommentUserAuditService extends IService<CommentUserAudit> {

    /**
     * 审核用户评论
     * <p>
     * 根据审核结果更新评论状态，并记录审核信息到审核表。
     * 审核通过后，评论状态更新为"通过"；
     * 审核拒绝后，评论状态更新为"拒绝"，并可记录拒绝原因。
     * </p>
     *
     * @param commentId 评论ID，用于标识待审核的评论
     * @param auditStatus 审核状态：1-通过，2-拒绝
     * @param auditReason 审核原因/拒绝理由，审核拒绝时必填，审核通过时可为空
     * @param auditorId 审核人ID，当前登录管理员的ID
     * @param auditorName 审核人姓名，当前登录管理员的姓名
     * @return 审核是否成功
     */
    Boolean auditComment(String commentId, Integer auditStatus, String auditReason, String auditorId, String auditorName);

    /**
     * 批量审核用户评论
     * <p>
     * 批量审核多条用户评论，支持统一通过或拒绝。
     * 对每条评论进行独立的验证和处理，记录详细的审核结果。
     * 返回审核结果统计，包括成功数量、失败数量和失败详情。
     * </p>
     *
     * @param commentIds 评论ID列表，用于标识待审核的多条评论
     * @param auditStatus 审核状态：1-通过，2-拒绝
     * @param auditReason 审核原因/拒绝理由，审核拒绝时必填，审核通过时可为空
     * @param auditorId 审核人ID，当前登录管理员的ID
     * @param auditorName 审核人姓名，当前登录管理员的姓名
     * @return 审核结果对象，包含成功数量、失败数量和失败详情
     */
    BatchAuditResult batchAuditComments(List<String> commentIds, Integer auditStatus, String auditReason, String auditorId, String auditorName);

    /**
     * 批量审核结果
     * <p>
     * 封装批量审核操作的执行结果，包括成功和失败的统计信息。
     * </p>
     */
    class BatchAuditResult implements Serializable {
        private static final long serialVersionUID = 1L;

        /**
         * 成功审核的评论数量
         */
        private int successCount;

        /**
         * 审核失败的评论数量
         */
        private int failCount;

        /**
         * 失败详情
         * Key: 评论ID
         * Value: 失败原因
         */
        private Map<String, String> failDetails;

        public BatchAuditResult() {
            this.successCount = 0;
            this.failCount = 0;
            this.failDetails = new HashMap<>();
        }

        public int getSuccessCount() {
            return successCount;
        }

        public void setSuccessCount(int successCount) {
            this.successCount = successCount;
        }

        public int getFailCount() {
            return failCount;
        }

        public void setFailCount(int failCount) {
            this.failCount = failCount;
        }

        public java.util.Map<String, String> getFailDetails() {
            return failDetails;
        }

        public void setFailDetails(java.util.Map<String, String> failDetails) {
            this.failDetails = failDetails;
        }

        /**
         * 增加成功计数
         */
        public void incrementSuccess() {
            this.successCount++;
        }

        /**
         * 增加失败计数
         */
        public void incrementFail() {
            this.failCount++;
        }

        /**
         * 添加失败详情
         *
         * @param commentId 评论ID
         * @param reason 失败原因
         */
        public void addFailDetail(String commentId, String reason) {
            this.failDetails.put(commentId, reason);
            this.incrementFail();
        }

        /**
         * 获取总数量
         *
         * @return 成功数量 + 失败数量
         */
        public int getTotalCount() {
            return successCount + failCount;
        }

        /**
         * 是否全部成功
         *
         * @return true-全部成功，false-存在失败
         */
        public boolean isAllSuccess() {
            return failCount == 0;
        }
    }
}
