package dev.lions.exceptions;

import lombok.Getter;

/**
 * Exception spécifique pour la gestion des erreurs liées aux tables de données.
 * Cette exception encapsule les problèmes survenant lors de la manipulation,
 * du tri ou du filtrage des données tabulaires.
 *
 * @author Lions Dev Team
 * @version 1.0
 */
@Getter
public class DataTableException extends BusinessException {

  private static final long serialVersionUID = 1L;

  /**
   * Identifiant de la table concernée par l'erreur
   * -- GETTER --
   *  Récupère l'identifiant de la table concernée.
   *
   * @return Identifiant de la table ou null si non spécifié

   */
  private final String tableId;

  /**
   * Type d'opération ayant échoué
   * -- GETTER --
   *  Récupère l'opération ayant échoué.
   *
   * @return Type d'opération ou null si non spécifié

   */
  private final DataTableOperation operation;

  /**
   * Crée une nouvelle instance avec un message d'erreur.
   *
   * @param message Description détaillée de l'erreur
   */
  public DataTableException(String message) {
    this(message, null, null, null);
  }

  /**
   * Crée une nouvelle instance avec un message et une cause.
   *
   * @param message Description détaillée de l'erreur
   * @param cause Cause originale de l'erreur
   */
  public DataTableException(String message, Throwable cause) {
    this(message, cause, null, null);
  }

  /**
   * Crée une nouvelle instance avec tous les détails de l'erreur.
   *
   * @param message Description détaillée de l'erreur
   * @param cause Cause originale de l'erreur
   * @param tableId Identifiant de la table concernée
   * @param operation Opération ayant échoué
   */
  public DataTableException(String message, Throwable cause, String tableId, DataTableOperation operation) {
    super(message, cause);
    this.tableId = tableId;
    this.operation = operation;
  }

  /**
   * Types d'opérations pouvant échouer sur une table de données.
   */
  @Getter
  public enum DataTableOperation {
    SORT("Tri"),
    FILTER("Filtrage"),
    PAGINATION("Pagination"),
    UPDATE("Mise à jour"),
    LOAD("Chargement");

    private final String label;

    DataTableOperation(String label) {
      this.label = label;
    }

  }

  @Override
  public String getMessage() {
    StringBuilder message = new StringBuilder(super.getMessage());

    if (tableId != null) {
      message.append(" [Table: ").append(tableId).append("]");
    }
    if (operation != null) {
      message.append(" [Opération: ").append(operation.getLabel()).append("]");
    }

    return message.toString();
  }
}