package dev.lions.unionflow.server.entity;

import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

/**
 * Entité ConfigurationWave pour la configuration de l'intégration Wave
 *
 * @author UnionFlow Team
 * @version 3.0
 * @since 2025-01-29
 */
@Entity
@Table(
    name = "configurations_wave",
    indexes = {
      @Index(name = "idx_config_wave_cle", columnList = "cle", unique = true)
    })
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@EqualsAndHashCode(callSuper = true)
public class ConfigurationWave extends BaseEntity {

  /** Clé de configuration */
  @NotBlank
  @Column(name = "cle", unique = true, nullable = false, length = 100)
  private String cle;

  /** Valeur de configuration (peut être encryptée) */
  @Column(name = "valeur", columnDefinition = "TEXT")
  private String valeur;

  /** Description de la configuration */
  @Column(name = "description", length = 500)
  private String description;

  /** Type de valeur (STRING, NUMBER, BOOLEAN, JSON, ENCRYPTED) */
  @Column(name = "type_valeur", length = 20)
  private String typeValeur;

  /** Environnement (SANDBOX, PRODUCTION, COMMON) */
  @Column(name = "environnement", length = 20)
  private String environnement;

  /** Méthode métier pour vérifier si la valeur est encryptée */
  public boolean isEncryptee() {
    return "ENCRYPTED".equals(typeValeur);
  }

  /** Callback JPA avant la persistance */
  @PrePersist
  protected void onCreate() {
    super.onCreate();
    if (typeValeur == null || typeValeur.isEmpty()) {
      typeValeur = "STRING";
    }
    if (environnement == null || environnement.isEmpty()) {
      environnement = "COMMON";
    }
  }
}

