package nccloud.openapi.ic.m47;

import nc.bs.framework.common.NCLocator;
import nc.vo.ic.m47.entity.SubcontInVO;
import nc.ws.opm.pub.utils.result.APIErrCodeEnum;
import nccloud.api.ic.m47.IAPISubcontInMaintain;
import nccloud.api.rest.utils.ResultMessageUtil;
import nccloud.openapi.scmpub.pub.NCCPubRestResource;
import org.json.JSONString;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @Classname SubcontInResource
 * @Description TODO
 * @Version 1.0.0
 * @Date 2025/5/15 8:54
 * @Created by sdlizheng
 */
@Path("ic/subcontin")
public class SubcontInResource extends NCCPubRestResource {

    private static String HEADTABLE = "ic_subcontin_h";
    private static String BODYTABLE = "ic_subcontin_b";

    /**
     *保存操作信息
     *
     * 该方法通过POST请求接收JSON格式的参数，处理后返回JSON格式的结果
     * 主要用于保存单个操作的信息，将接收到的参数封装成列表的形式，
     * 调用另一个save方法进行实际的保存操作
     *
     * @param param 包含操作信息的键值对参数
     * @return 返回保存操作的结果，格式为JSON字符串
     */
    @POST
    @Path("operation/save")
    @Consumes({"application/json"})
    @Produces({"application/json"})
    public JSONString save(Map<String, Object> param) {
        // 将接收到的参数封装成列表，以便调用实际的保存方法
        List<Map<String, Object>> paramList = new ArrayList();
        paramList.add(param);

        // 调用实际的保存方法，并返回保存结果
        JSONString result = this.save(paramList);
        return result;
    }
    /**
     * 保存数据接口
     * 该方法接收一个包含表头和表体信息的JSON数组，尝试将其保存到数据库中
     * 如果传入的数据格式不正确（不包含表头或表体信息），则返回错误信息
     * 如果保存过程中发生异常，则返回异常信息
     *
     * @param paramList 一个包含多个数据项的列表，每个数据项是一个Map对象，必须包含表头和表体信息
     * @return 返回一个JSON字符串，包含保存结果或错误信息
     */
    @POST
    @Path("save")
    @Consumes({"application/json"})
    @Produces({"application/json"})
    public JSONString save(List<Map<String, Object>> paramList){
        try {
            // 遍历传入的参数列表，检查每个Map对象是否包含表头和表体信息
            for (Map<String, Object> map : paramList) {
                if (!map.containsKey(HEADTABLE) || !map.containsKey(BODYTABLE)) {
                    // 如果任一数据项不包含表头或表体信息，返回错误信息
                    return ResultMessageUtil.exceptionToJSON("传入数据异常，参数要包含表头信息和表体信息", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
                }
            }
            // 调用服务接口保存数据，并返回保存结果
            SubcontInVO[] save = NCLocator.getInstance().lookup(IAPISubcontInMaintain.class).save(paramList);
            return ResultMessageUtil.toJSON(save, "保存成功");
        } catch (Exception e) {
            // 如果保存过程中发生异常，返回异常信息
            return ResultMessageUtil.exceptionToJSON(e);
        }
    }
}
