package com.cloudhandson.vpdbackoffice.domain.masking;

import java.util.Arrays;

/**
 * Curated Data Redaction behaviours.  A rule selects one template; operators
 * never enter raw DBMS_REDACT expressions from the backoffice UI.
 */
public enum MaskingTemplate {
  NULLIFY(
      "NULLIFY",
      "값 숨김 (NULL)",
      "값을 NULL로 반환합니다. ASO/Data Redaction 컬럼 마스킹에 사용합니다.",
      "DBMS_REDACT.NULLIFY",
      "NULL"),
  FULL(
      "FULL",
      "전체 마스킹",
      "전체 값을 가립니다. Oracle 기본값은 문자형 공백, 숫자형 0입니다.",
      "DBMS_REDACT.FULL",
      "문자형은 공백 / 숫자형은 0"),
  TEXT_PARTIAL(
      "TEXT_PARTIAL",
      "문자열 일부 마스킹",
      "첫 글자만 남기고 나머지를 가리는 사전 정의 문자열 규칙입니다.",
      "DBMS_REDACT.REGEXP",
      "A******** (예시)"),
  RRN_PARTIAL(
      "RRN_PARTIAL",
      "식별번호 부분 마스킹",
      "앞 6자리만 표시하고 나머지를 가리는 사전 정의 식별번호 규칙입니다.",
      "DBMS_REDACT.REGEXP",
      "123456-******* (예시)");

  private final String code;
  private final String label;
  private final String description;
  private final String asoFunction;
  private final String previewResult;

  MaskingTemplate(String code, String label, String description, String asoFunction, String previewResult) {
    this.code = code;
    this.label = label;
    this.description = description;
    this.asoFunction = asoFunction;
    this.previewResult = previewResult;
  }

  public String code() {
    return code;
  }

  public String label() {
    return label;
  }

  public String description() {
    return description;
  }

  public String asoFunction() {
    return asoFunction;
  }

  /** Human-readable result shown before an administrator assigns the rule. */
  public String previewResult() {
    return previewResult;
  }

  public static MaskingTemplate from(String code) {
    return Arrays.stream(values())
        .filter(value -> value.code.equalsIgnoreCase(code))
        .findFirst()
        .orElseThrow(() -> new IllegalArgumentException("지원하지 않는 마스킹 템플릿입니다: " + code));
  }
}
