package com.product.data.sync.util;

import cn.hutool.core.lang.UUID;
import com.product.common.lang.StringUtils;
import com.product.core.cache.DataPoolCacheImpl;
import com.product.core.connection.ConnectionManager;
import com.product.core.entity.DataTableEntity;
import com.product.core.entity.FieldMetaEntity;
import com.product.core.entity.FieldSetEntity;
import com.product.datasource.dao.Dao;
import com.product.datasource.dao.impl.MysqlDaoImpl;
import com.product.util.BaseUtil;
import org.springframework.stereotype.Service;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

@Service
public class BatchAddData {


	public void add(DataTableEntity dt) throws Exception {
		Dao dao = new MysqlDaoImpl(() -> ConnectionManager.getConnection());
		if (DataTableEntity.isEmpty(dt)) {
			return;
		}
		FieldMetaEntity meta = dt.getMeta();
		String tableName = dt.getTableName().toString();
		//鍦ㄧ紦瀛樿〃涓幏鍙栬琛ㄧ殑鎵€鏈夊瓧娈�
//        DataPoolCacheImpl.getInstance().getCacheData("")
		FieldSetEntity tableMeta = BaseUtil.getSingleInfoByCache("鎵€鏈夎〃淇℃伅", new String[]{tableName});
		String tableUuid = tableMeta.getString("uuid");
		//琛ㄥ瓧娈�
		DataTableEntity fieldTableMeta = DataPoolCacheImpl.getInstance().getCacheData("鎵€鏈夊瓧娈典俊鎭苟鎸夎〃鍒嗙粍", new String[]{tableUuid});

		List<String> fields = new ArrayList<>();
		for (int i = 0; i < fieldTableMeta.getRows(); i++) {
			FieldSetEntity fieldMeta = fieldTableMeta.getFieldSetEntity(i);
			String fieldType = fieldMeta.getString("field_type");
			String fieldName = fieldMeta.getString("field_name");
			if (!"pk".equalsIgnoreCase(fieldType)) {
				fields.add(fieldName);
			}
		}
		DataTableEntity addDt = new DataTableEntity();
		List<DataTableEntity> addDtList = new ArrayList<>();
		for (int i = 0; i < dt.getRows(); i++) {
			if(FieldSetEntity.isEmpty(dt.getFieldSetEntity(i))){
				continue;
			}
			if (i == 5000) {
				addDtList.add(addDt);
				addDt = new DataTableEntity();
			}
			FieldSetEntity ff = new FieldSetEntity(tableName);
			for (String field : fields) {
				ff.setValue(field, dt.getObject(i, field));
			}
			if (StringUtils.isEmpty(ff.getString("uuid"))) {
				ff.setValue("uuid", UUID.randomUUID().toString());
				dt.setFieldValue(i, "uuid", ff.getString("uuid"));
			}
			addDt.addFieldSetEntity(ff);
		}
		addDtList.add(addDt);
		for (DataTableEntity dataTableEntity : addDtList) {
			dao.addBatch(dataTableEntity);
		}
		dao.closeConnection();
	}
}