// @formatter:off
package %s;

import hope.common.spring.audit.AuditContext;
import hope.common.spring.audit.AuditContextSupplier;
import hope.common.spring.data.persistence.context.PersistenceContext;
import hope.common.spring.security.Customer;
import hope.common.spring.security.context.HopeContextHolder;
import hope.common.spring.util.NumberUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Generated;

@Generated("H.O.P.E. Infra Team")
@Service
public class %sAuditContextSupplier implements AuditContextSupplier {

  protected final PersistenceContext persistenceContext;

  protected final AuditContext auditContext;

  public %sAuditContextSupplier(
      @Autowired(required = false) PersistenceContext _persistenceContext) {

    this.persistenceContext =
        _persistenceContext == null ? PersistenceContext.DEFAULT : _persistenceContext;

    AuditContext.AuditContextBuilder builder = AuditContext.builder();

    // Current persistent context
    final Object userId = persistenceContext.defaultUserId();
    final Object tenantId = persistenceContext.defaultTenant();

    // Persistent context Identify type is %s
    builder.identifier(%s(userId));

    // Persistent context Tenant type is %s
    builder.tenant(%s(tenantId));

    auditContext = builder.build();
  }

  @Override
  public <Identify, Tenant> AuditContext<Identify, Tenant> get() {
    final Customer customer = HopeContextHolder.customer();
    if (customer != null && !customer.isAnonymous()) {
      return AuditContext.from(customer);
    }
    return auditContext;
  }
}
