package dmo.fs.db.wsnext.hib.sf;

import dmo.fs.utils.Constants;
import io.quarkus.arc.InjectableInstance;
import io.quarkus.arc.Unremovable;
import io.quarkus.hibernate.orm.PersistenceUnit;
import jakarta.enterprise.context.ApplicationScoped;
import org.hibernate.reactive.mutiny.Mutiny;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Unremovable
@ApplicationScoped
public class MutinySessionFactory {
    protected static final Logger logger = LoggerFactory.getLogger(MutinySessionFactory.class.getName());
    /*
        To use;
             export QUARKUS_HIBERNATE_ORM_SQLSERVER_ACTIVE=true  or
             export QUARKUS_HIBERNATE_ORM_ORACLE_ACTIVE=true
     */
    @PersistenceUnit("oracle")
    InjectableInstance<Mutiny.SessionFactory> oracleFactory;

    @PersistenceUnit("sqlserver")
    InjectableInstance<Mutiny.SessionFactory> sqlserverFactory;

    public MutinySessionFactory() {
    }

    public
      Mutiny.SessionFactory getSqlserverSessionFactory() {
        return sqlserverFactory.listActive().get(0);
    }

    public
      Mutiny.SessionFactory getOracleSessionFactory() {
        return oracleFactory.listActive().get(0);
    }

    public Mutiny.SessionFactory getSessionFactory() {
        if(sqlserverFactory.listActive().isEmpty() && oracleFactory.listActive().isEmpty()) {
            logger.error("{}{}", Constants.DB_CONFIG_ERR, Constants.DB_HIBERNATE_ERR);
            throw new RuntimeException("Database Config Failure");
        }
        return sqlserverFactory.listActive().isEmpty() ? oracleFactory.listActive().get(0) :
          sqlserverFactory.listActive().get(0);
    }
}
