package research.loghunter.entity;

import jakarta.persistence.*;
import lombok.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name = "servers")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Server {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String name;  // 서버 별칭

    @Column(nullable = false)
    private String host;

    @Column(nullable = false)
    private Integer port;  // 기본 22

    @Column(nullable = false)
    private String username;

    @Column(nullable = false)
    private String authType;  // PASSWORD or KEY_FILE

    private String encryptedPassword;  // 암호화된 비밀번호

    private String keyFilePath;  // 키 파일 경로

    private String encryptedPassphrase;  // 암호화된 passphrase

    @Column(nullable = false)
    private Boolean active;  // 활성화 여부

    // 서버 시간과 로컬 시간의 차이 (분 단위)
    // 예: 서버가 UTC이고 로컬이 KST(+9)면 -540
    // 로그시간 + offset = 로컬시간
    private Integer timeOffsetMinutes;
    
    // 마지막으로 시간 동기화 체크한 일시
    private LocalDateTime lastTimeSyncAt;

    private LocalDateTime lastScanAt;  // 마지막 분석 일시

    private LocalDateTime lastErrorAt;  // 마지막 에러 발생 일시

    @Column(nullable = false, updatable = false)
    private LocalDateTime createdAt;

    private LocalDateTime updatedAt;

    @OneToMany(mappedBy = "server", cascade = CascadeType.ALL, orphanRemoval = true)
    @Builder.Default
    private List<ServerLogPath> logPaths = new ArrayList<>();

    @PrePersist
    protected void onCreate() {
        createdAt = LocalDateTime.now();
        updatedAt = LocalDateTime.now();
        if (active == null) active = true;
        if (port == null) port = 22;
        if (timeOffsetMinutes == null) timeOffsetMinutes = 0;
    }

    @PreUpdate
    protected void onUpdate() {
        updatedAt = LocalDateTime.now();
    }
}
