package tv.pluto.core;

import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;
import com.plutotv.test.lib.LogUtils;
import lombok.experimental.UtilityClass;
import tv.pluto.utils.DbPropertiesHolder;

@UtilityClass
public class MongoDbManager {
  private static final int MIN_POOL_SIZE = 30;
  private static final int MAX_POOL_SIZE = 100;
  private static volatile MongoClient mongoClient; // NOSONAR
  private static volatile MongoDatabase mongoDatabase; // NOSONAR

  public static synchronized void initConnection() {
    if (mongoClient == null) {
      try {
        String uri = DbPropertiesHolder.getDbUri();
        String dbName = DbPropertiesHolder.getDbName();

        MongoClientSettings settings =
            MongoClientSettings.builder()
                .applyConnectionString(new ConnectionString(uri))
                .applyToConnectionPoolSettings(
                    builder -> builder.maxSize(MAX_POOL_SIZE).minSize(MIN_POOL_SIZE))
                .build();

        mongoClient = MongoClients.create(settings);
        mongoDatabase = mongoClient.getDatabase(dbName);
        LogUtils.logInfoMessage("MongoDB connection initialized successfully.");
      } catch (Exception e) {
        LogUtils.logSevereMessageThenFail(
            "Failed to initialize MongoDB connection: " + e.getMessage());
        throw e;
      }
    }
  }

  public static synchronized MongoDatabase getDatabase() {
    if (mongoClient == null) {
      initConnection();
    }
    return mongoDatabase;
  }

  public static synchronized void cleanupConnection() {
    try {
      if (mongoClient != null) {
        mongoClient.close();
        LogUtils.logInfoMessage("MongoDB connection closed successfully.");
      }
    } catch (Exception e) {
      LogUtils.logSevereMessage("Failed to close MongoDB connection: " + e.getMessage());
    } finally {
      mongoClient = null;
      mongoDatabase = null;
    }
  }
}
