/*
 ************************************************************************************
 * Copyright (C) 2019 Openbravo S.L.U.
 * Licensed under the Openbravo Commercial License version 1.0
 * You may obtain a copy of the License at http://www.openbravo.com/legal/obcl.html
 * or in the legal folder of this module distribution.
 ************************************************************************************
 */
package com.openbravo.cds.custom.event;

import javax.enterprise.event.Observes;

import org.apache.log4j.Logger;
import org.openbravo.base.model.Entity;
import org.openbravo.base.model.ModelProvider;
import org.openbravo.base.model.Property;
import org.openbravo.client.kernel.event.EntityNewEvent;
import org.openbravo.client.kernel.event.EntityPersistenceEvent;
import org.openbravo.client.kernel.event.EntityPersistenceEventObserver;
import org.openbravo.client.kernel.event.EntityUpdateEvent;
import org.openbravo.model.common.plm.Product;

import com.openbravo.cds.custom.ProductKeyfromSequenceUtils;

public class ProductKeyfromSequenceEventHandler extends EntityPersistenceEventObserver {
  protected Logger logger = Logger.getLogger(this.getClass());
  private static Entity[] entities = { ModelProvider.getInstance().getEntity(Product.ENTITY_NAME) };

  @Override
  protected Entity[] getObservedEntities() {
    return entities;
  }

  public void onSave(@Observes EntityNewEvent event) {
    if (!isValidEvent(event)) {
      return;
    }
    Product product = (Product) event.getTargetInstance();
    if (ProductKeyfromSequenceUtils.isTemporaryKey(product)) {
      setFinalKey(event);
    }
  }

  public void onUpdate(@Observes EntityUpdateEvent event) {
    if (!isValidEvent(event)) {
      return;
    }
    Product product = (Product) event.getTargetInstance();
    if (ProductKeyfromSequenceUtils.isTemporaryKey(product)) {
      setFinalKey(event);
    }
  }

  private void setFinalKey(EntityPersistenceEvent event) {
    final Entity productEntity = ModelProvider.getInstance().getEntity(Product.ENTITY_NAME);
    final Property gsearchKeyProperty = productEntity.getProperty(Product.PROPERTY_SEARCHKEY);
    Product product = (Product) event.getTargetInstance();

    if (product.getCustcdsSequence() != null) {
      String generatedSearchKey = ProductKeyfromSequenceUtils
          .getFinalAutoProductKey(product.getCustcdsSequence());
      if (generatedSearchKey != null) {
        event.setCurrentState(gsearchKeyProperty, generatedSearchKey);
      }
    }
  }

}
