package org.orienteer.notifications.repository;

import com.orientechnologies.orient.core.db.document.ODatabaseDocument;
import com.orientechnologies.orient.core.db.record.OIdentifiable;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;
import org.orienteer.core.util.CommonUtils;
import org.orienteer.notifications.module.ONotificationModule;
import ru.ydn.wicket.wicketorientdb.utils.DBClosure;

import java.util.List;

/**
 * Repository for {@link ONotificationModule.Module}
 */
public final class ONotificationModuleRepository {

  private ONotificationModuleRepository() {}

  public static ONotificationModule.Module getModule() {
    return DBClosure.sudo(ONotificationModuleRepository::getModule);
  }

  public static ONotificationModule.Module getModule(ODatabaseDocument db) {
    return new ONotificationModule.Module(getModuleAsDocument(db));
  }

  public static ODocument getModuleAsDocument() {
    return DBClosure.sudo(ONotificationModuleRepository::getModuleAsDocument);
  }

  public static ODocument getModuleAsDocument(ODatabaseDocument db) {
    String sql = String.format("select from %s where %s = ?", ONotificationModule.OMODULE_CLASS, ONotificationModule.OMODULE_NAME);
    List<OIdentifiable> identifiables = db.query(new OSQLSynchQuery<>(sql, 1), ONotificationModule.NAME);
    return CommonUtils.getDocument(identifiables)
            .orElseThrow(() -> new IllegalStateException("There is no module with name: " + ONotificationModule.NAME));
  }

}