package io.ebeaninternal.server.persist.dml;

import io.ebean.config.dbplatform.DatabasePlatform;
import io.ebeaninternal.server.deploy.BeanDescriptor;
import io.ebeaninternal.server.persist.BeanPersister;
import io.ebeaninternal.server.persist.BeanPersisterFactory;

/**
 * Factory for creating a DmlBeanPersister for a bean type.
 */
public final class DmlBeanPersisterFactory implements BeanPersisterFactory {

  private final DatabasePlatform dbPlatform;
  private final MetaFactory metaFactory;

  public DmlBeanPersisterFactory(DatabasePlatform dbPlatform) {
    this.dbPlatform = dbPlatform;
    this.metaFactory = new MetaFactory(dbPlatform);
  }

  /**
   * Create a DmlBeanPersister for the given bean type.
   */
  @Override
  public BeanPersister create(BeanDescriptor<?> desc) {
    if (desc.isDocStoreOnly()) {
      return new DocStoreBeanPersister(GeneratedProperties.of(desc));
    }
    UpdateMeta updMeta = metaFactory.createUpdate(desc);
    DeleteMeta delMeta = metaFactory.createDelete(desc);
    InsertMeta insMeta = metaFactory.createInsert(desc);
    return new DmlBeanPersister(dbPlatform, updMeta, insMeta, delMeta);
  }

}
