@Configuration
@Getter
public class AuthConfig {
  private final Integer maxLoginFailCount;

  public AuthConfig(@Value("${auth.max-login-fail-count}") Integer maxLoginFailCount) {
    this.maxLoginFailCount = maxLoginFailCount;
  }
}
@Builder
@Getter
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "user")
@Entity
@EntityListeners(AuditingEntityListener.class)
public class UserEntity {

  @Id
  @Size(max = 255)
  @Column(name = "user_id")
  private String userId;

  @NotBlank
  @Size(max = 255)
  @Column(name = "user_name")
  private String userName;

  @Size(max = 255)
  @Column(name = "user_password")
  private String userPassword;

  @NotBlank
  @Size(max = 255)
  @Column(name = "user_email")
  private String userEmail;

  @NotNull
  @Enumerated(EnumType.STRING)
  @Column(name = "user_level")
  private User.UserLevel userLevel = User.UserLevel.USER;

  @NotNull
  @Enumerated(EnumType.STRING)
  @Column(name = "active_yn")
  private User.UserActiveYn activeYn = User.UserActiveYn.Y;

  @NotNull
  @Column(name = "login_fail_count")
  private Integer loginFailCount = 0;

  @Column(name = "user_birth")
  private LocalDate userBirth;

  @NotNull
  @Enumerated(EnumType.STRING)
  @Column(name = "auth_type")
  private User.UserAuthType authType = User.UserAuthType.N;

  @Enumerated(EnumType.STRING)
  @Column(name = "social_provider")
  private User.UserSocialProvider socialProvider;

  @Size(max = 255)
  @Column(name = "social_id")
  private String socialId;

  @Column(name = "created_at")
  @CreatedDate
  private LocalDateTime createdAt;

  @Column(name = "updated_at")
  @LastModifiedDate
  private LocalDateTime updatedAt;

  // 로그인 실패 기록 초기화
  public UserEntity clearFailedLogin() {
    this.loginFailCount = 0;
    return this;
  }

  // 로그인 실패 기록 증가. 최대 실패 횟수 이상 실패 시, 사용자 비활성화
  public UserEntity increaseFailedLogin(Integer maxFailedLoginCount) {
    this.loginFailCount = this.loginFailCount + 1;
    if (loginFailCount >= maxFailedLoginCount) {
      this.activeYn = User.UserActiveYn.N;
    }
    return this;
  }
}