/**
 * 项目审核命令类
 * 
 * 该类用于处理项目信息的审核操作，包括参数验证和项目状态更新
 * 通过注解@Java110Cmd声明服务代码为"community.auditCommunity"
 * 实现项目审核状态和审核原因的更新功能
 * 
 * @author Java110
 * @version 1.0
 * @since 2023
 */
package com.java110.community.cmd.community;

import com.alibaba.fastjson.JSONObject;
import com.java110.core.annotation.Java110Cmd;
import com.java110.core.annotation.Java110Transactional;
import com.java110.core.context.ICmdDataFlowContext;
import com.java110.core.event.cmd.Cmd;
import com.java110.core.event.cmd.CmdEvent;
import com.java110.dto.community.CommunityDto;
import com.java110.intf.community.ICommunityInnerServiceSMO;
import com.java110.intf.community.ICommunityV1InnerServiceSMO;
import com.java110.po.community.CommunityPo;
import com.java110.utils.exception.CmdException;
import com.java110.utils.util.Assert;
import com.java110.utils.util.BeanConvertUtil;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;
import java.util.Map;

@Java110Cmd(serviceCode = "community.auditCommunity")
public class AuditCommunityCmd extends Cmd {

    /**
     * 项目内部服务接口
     * 用于查询项目信息
     */
    @Autowired
    private ICommunityInnerServiceSMO communityInnerServiceSMOImpl;

    /**
     * 项目V1版本内部服务接口
     * 用于更新项目信息
     */
    @Autowired
    private ICommunityV1InnerServiceSMO communityV1InnerServiceSMOImpl;

    /**
     * 参数验证方法
     * 
     * 验证请求参数中是否包含必要的项目审核信息
     * 包括项目ID、审核状态和审核原因
     * 
     * @param event 命令事件对象，包含事件相关信息
     * @param context 命令数据流上下文，包含请求和响应数据
     * @param reqJson 请求参数的JSON对象
     * @throws CmdException 当参数验证失败时抛出异常
     */
    @Override
    public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException {
        // 验证项目ID参数是否存在且不为空
        Assert.hasKeyAndValue(reqJson, "communityId", "项目ID不能为空");
        // 验证审核状态参数是否存在且不为空
        Assert.hasKeyAndValue(reqJson, "state", "必填，请填写项目审核状态");
        // 验证审核原因参数是否存在且不为空
        Assert.hasKeyAndValue(reqJson, "remark", "必填，请填写项目审核原因");
    }

    /**
     * 执行项目审核命令
     * 
     * 根据请求参数更新项目的审核状态和审核原因
     * 使用@Java110Transactional注解确保操作的事务性
     * 
     * @param event 命令事件对象，包含事件相关信息
     * @param context 命令数据流上下文，包含请求和响应数据
     * @param reqJson 请求参数的JSON对象
     * @throws CmdException 当项目信息查询失败或更新失败时抛出异常
     */
    @Override
    @Java110Transactional
    public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException {
        // 创建项目数据传输对象
        CommunityDto communityDto = new CommunityDto();
        // 设置要查询的项目ID
        communityDto.setCommunityId(reqJson.getString("communityId"));
        // 根据项目ID查询项目信息
        List<CommunityDto> communityDtos = communityInnerServiceSMOImpl.queryCommunitys(communityDto);
        
        // 验证查询结果，确保只查询到一条项目记录
        Assert.listOnlyOne(communityDtos, "未查询到该项目信息【" + communityDto.getCommunityId() + "】");
        // 获取查询到的项目信息
        communityDto = communityDtos.get(0);

        // 将项目DTO对象转换为Map，便于后续操作
        Map oldCommunityInfo = BeanConvertUtil.beanCovertMap(communityDto);
        // 更新项目状态为请求参数中的审核状态
        oldCommunityInfo.put("state", reqJson.getString("state"));
        // 将更新后的Map转换为项目持久化对象
        CommunityPo communityPo = BeanConvertUtil.covertBean(oldCommunityInfo, CommunityPo.class);
        // 执行项目信息更新操作
        int flag = communityV1InnerServiceSMOImpl.updateCommunity(communityPo);

        // 检查更新操作是否成功，如果影响行数小于1则抛出异常
        if (flag < 1) {
            throw new CmdException("更新项目失败");
        }
    }
}