package com.cloudhandson.vpdbackoffice.domain.permission;

public record PermissionView(
    long permissionId,
    long roleId,
    String roleName,
    long objectId,
    String objectName,
    String action,
    String permissionEffect,
    String rules,
    String visibleColumns,
    String filterPreview,
    String nullPolicyPreview
) {

  public String businessRuleSummary() {
    if (rules == null || rules.isBlank()) {
      return "-";
    }
    return java.util.Arrays.stream(rules.split(","))
        .map(String::trim)
        .filter(value -> !value.isBlank())
        .map(PermissionView::businessRuleLabel)
        .collect(java.util.stream.Collectors.joining(System.lineSeparator() + "AND "));
  }

  public String storedRuleSummary() {
    return rules == null || rules.isBlank() ? "-" : rules;
  }

  public String vpdMappingSummary() {
    return filterPreview == null || filterPreview.isBlank() ? "-" : filterPreview;
  }

  public String columnControlSummary() {
    if (visibleColumns == null || visibleColumns.isBlank()) {
      return "컬럼 원문/마스킹은 컬럼 마스킹에서 관리";
    }
    return "기존 권한별 표시 예외 값: " + visibleColumns
        + " · 신규 컬럼 제어는 컬럼 마스킹에서 관리";
  }

  private static String businessRuleLabel(String rawRule) {
    String upper = rawRule.toUpperCase(java.util.Locale.ROOT);
    if ("ALL".equals(upper)) {
      return "전체 행";
    }
    if (upper.contains(" TOKEN_SUBJECT")) {
      return "토큰으로 식별된 이해관계자 본인 행";
    }
    if (upper.contains(" OWN_CONTRACT")) {
      return "담당 게임 서비스 범위";
    }
    if (upper.contains(" CHANNEL_CONTRACT")) {
      return "토큰 채널 게임 서비스 범위";
    }
    if (upper.contains(" OWN_CUSTOMER")) {
      return "담당 게임 사용자·거래 데이터 범위";
    }
    if (upper.contains(" CHANNEL_CUSTOMER")) {
      return "토큰 채널 게임 사용자·거래 데이터 범위";
    }
    if (upper.contains(" STATIC_SQL ")) {
      return "정적 SQL 조건: " + rawRule.replaceFirst("(?i)^\\s*STATIC_SQL\\s+", "");
    }
    if (upper.startsWith("STATIC_SQL ")) {
      return "정적 SQL 조건: " + rawRule.substring("STATIC_SQL ".length());
    }
    if (upper.contains(" MY_DEPT")) {
      return "내 부서 행";
    }
    if (upper.contains(" SELF")) {
      return "내 사번/소유자 행";
    }
    if (upper.contains(" TAG ")) {
      return "태그 조건: " + rawRule;
    }
    return rawRule;
  }
}
