package com.unicorn.hgzero.user.domain;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

/**
 * 사용자 도메인 모델
 * 사용자 인증 및 계정 정보를 표현
 */
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {

    /**
     * 사용자 ID
     */
    private String userId;

    /**
     * 사용자 이름
     */
    private String username;

    /**
     * 이메일
     */
    private String email;

    /**
     * 권한 (USER, ADMIN)
     */
    private String authority;

    /**
     * 계정 잠금 여부
     */
    private Boolean locked;

    /**
     * 로그인 실패 횟수
     */
    private Integer failedLoginAttempts;

    /**
     * 마지막 로그인 일시
     */
    private LocalDateTime lastLoginAt;

    /**
     * 계정 잠금 일시
     */
    private LocalDateTime lockedAt;

    /**
     * 계정 잠금 해제
     */
    public void unlock() {
        this.locked = false;
        this.failedLoginAttempts = 0;
        this.lockedAt = null;
    }

    /**
     * 로그인 실패 기록
     * 5회 실패 시 계정 잠금
     */
    public void recordLoginFailure() {
        this.failedLoginAttempts++;
        if (this.failedLoginAttempts >= 5) {
            this.locked = true;
            this.lockedAt = LocalDateTime.now();
        }
    }

    /**
     * 로그인 성공 기록
     */
    public void recordLoginSuccess() {
        this.failedLoginAttempts = 0;
        this.lastLoginAt = LocalDateTime.now();
    }

    /**
     * 계정 잠금 여부 확인
     * 30분 경과 시 자동 해제
     */
    public boolean isLocked() {
        if (this.locked && this.lockedAt != null) {
            // 30분 경과 시 자동 해제
            if (LocalDateTime.now().isAfter(this.lockedAt.plusMinutes(30))) {
                this.unlock();
                return false;
            }
            return true;
        }
        return false;
    }
}
