package dmo.fs.db.dodex.mssql;

import dmo.fs.db.dodex.entities.Users;
import dmo.fs.db.dodex.hib.MutinySessionFactory;
import jakarta.enterprise.inject.spi.CDI;
import org.hibernate.reactive.mutiny.Mutiny;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.Serial;
import java.io.Serializable;
import java.time.Duration;
import java.util.List;

public class DodexDatabaseMssql extends DbMssql implements Serializable {
  @Serial
  private static final long serialVersionUID = 1L;
  private final static Logger logger = LoggerFactory.getLogger(DodexDatabaseMssql.class.getName());
  private Mutiny.SessionFactory sessionFactory;

    public void sessionFactorySetup() throws Exception {
      MutinySessionFactory mutinySessionFactory =
        CDI.current().select(MutinySessionFactory.class).isUnsatisfied() ? null :
          CDI.current().select(MutinySessionFactory.class).get();

      if(mutinySessionFactory == null) {
          throw new NullPointerException("MutinySessionFactory from CDI");
      }

      List<Mutiny.SessionFactory> msfList = mutinySessionFactory.getSqlserverSessionFactory().listActive();
      if(!msfList.isEmpty()) {
          sessionFactory = msfList.get(0);
      } else {
          throw new Exception("MutinySessionFactory from CDI not found");
      }
  }


  public void configDatabase() {

    Mutiny.Session mutinySession = sessionFactory.openSession().await().atMost(Duration.ofSeconds(2));

    mutinySession.createQuery("from dmo.fs.db.dodex.entities.sqlserver.Users", Users.class)
        .getResultCount().onItem().invoke((userCount) -> {
            logger.info("Number of Users: {} ", userCount);
        }).subscribe().asCompletionStage();
  }

    public Mutiny.SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}
