package com.yice.webadmin.app.service.impl;

import com.alibaba.fastjson.JSONArray;
import com.yice.common.core.object.MyPageParam;
import com.yice.webadmin.app.constant.MongoConstant;
import com.yice.webadmin.app.data.DatasetData;
import com.yice.webadmin.app.service.DatasetDataService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;

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

/**
 * 数据集版本数据操作服务类。
 *
 * @author linking
 * @date 2023-04-13
 */
@Slf4j
@Service("datasetDataService")
public class DatasetDataServiceImpl implements DatasetDataService {

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 保存新增对象。
     *
     * @param datasetData 新增对象。
     * @return 返回新增对象。
     */
    public void save(DatasetData datasetData) {
        if (StringUtils.isNotBlank(datasetData.getData())) {
            List<Document> documents = new ArrayList<>();
            JSONArray jsonArray = JSONArray.parseArray(datasetData.getData());
            if (null != jsonArray && jsonArray.size() > 0) {
                for (int i = 0; i < jsonArray.size(); i++) {
                    Document document = new Document(MongoConstant.DATA, jsonArray.getJSONObject(i))
                            .append(MongoConstant.VERSION, datasetData.getVersionId())
                            .append(MongoConstant.CREATE_TIME, datasetData.getCreateTime());
                    documents.add(document);
                }
            }
            mongoTemplate.insert(documents,
                    MongoConstant.COLLECT_NAME + datasetData.getVersionId());
        }
    }

    /**
     * 查询列表集合
     * @param versionId 版本标识
     * @param pageParam 页码参数
     * @return 返回查看对象列表
     */
    public List<DatasetData> list(Long versionId, MyPageParam pageParam) {
        Query query = new Query(Criteria.where(MongoConstant.VERSION).is(versionId))
                .skip((pageParam.getPageNum() - 1) * pageParam.getPageSize())
                .limit(pageParam.getPageSize());

        return mongoTemplate.find(query, DatasetData.class,
                MongoConstant.COLLECT_NAME + versionId);
    }

    /**
     * 查询列表集合总条数
     * @param versionId 版本标识
     * @return 返回总条数
     */
    public Long count(Long versionId) {
        Query query = new Query(Criteria.where(MongoConstant.VERSION).is(versionId));
        return mongoTemplate.count(query, DatasetData.class,
                MongoConstant.COLLECT_NAME + versionId);
    }

    /**
     * 根据id查询该条信息。
     *
     * @param id 文档标识。
     * @param versionId 版本标识。
     * @return 返回查看对象。
     */
    public DatasetData view(String id, Long versionId) {
        return mongoTemplate.findById(id, DatasetData.class,
                MongoConstant.COLLECT_NAME + versionId);
    }

    /**
     * 更新数据对象。
     *
     * @param datasetData 更新的对象。
     * @return 成功返回true，否则false。
     */
    public void update(DatasetData datasetData) {
       mongoTemplate.save(datasetData,
               MongoConstant.COLLECT_NAME + datasetData.getVersionId());
    }

    /**
     * 删除指定数据。
     *
     * @param id 文档标识。
     * @param versionId 版本标识。
     * @return 返回受影响的行数。
     */
    public Long remove(String id, Long versionId) {
        Query query = new Query(Criteria.where(MongoConstant.ID).is(id));
        return mongoTemplate.remove(query, DatasetData.class,
                MongoConstant.COLLECT_NAME + versionId).getDeletedCount();
    }

    /**
     * 删除整个集合中的文档数据。
     *
     * @param versionId 版本标识。
     * @return 返回受影响的行数。
     */
    public void delete(Long versionId) {
        mongoTemplate.dropCollection(MongoConstant.COLLECT_NAME + versionId);
    }
}
