package tv.pluto.mongo.utils;

import static tv.pluto.core.MongoDbManager.getDatabase;

import com.mongodb.BasicDBObject;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.result.InsertOneResult;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;
import org.bson.Document;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import tv.pluto.mongo.entities.cronhistories.CronHistory;
import tv.pluto.utils.CommonUtils;

public class CronHistoriesUtils extends MongoUtils {
  private static final Logger logger = LoggerFactory.getLogger(CronHistoriesUtils.class);
  private MongoCollection<Document> cronHistoriesCollection;

  public CronHistoriesUtils() {
    super("cronhistories", new CronHistory());
    this.cronHistoriesCollection = getDatabase().getCollection("cronhistories", Document.class);
  }

  public InsertOneResult createCronHiStoryDoc() {
    Instant testTime = Instant.now().minus(3, ChronoUnit.DAYS);
    Document document =
        new Document()
            .append("jobType", "test-data" + CommonUtils.getRandomString())
            .append("ranAt", testTime)
            .append("createdAt", testTime)
            .append("updatedAt", testTime);

    try {
      InsertOneResult result = cronHistoriesCollection.insertOne(document);
      logger.info("Document inserted successfully with id: {}", result.getInsertedId().toString());
      return result;
    } catch (Exception e) {
      logger.error("Error inserting document: ", e);
      throw e;
    }
  }

  public List<CronHistory> getDocumentsFieldTimeOperator(
      String field, Instant time, String operator) {
    List<CronHistory> result = new ArrayList<>();
    BasicDBObject query = new BasicDBObject(field, new BasicDBObject(operator, time));

    genericCollection.find(query).forEach(e -> result.add((CronHistory) e));
    return result;
  }

  public <T> T getRandomCronNotTestData() {
    Document query =
        new Document("jobType", new Document("$not", new Document("$regex", "^test-data")));
    return (T) genericCollection.find(query).first();
  }
}
