package com.bio.bio_backend.global.entity;

import com.bio.bio_backend.global.utils.SecurityUtils;
import jakarta.persistence.PrePersist;
import jakarta.persistence.PreUpdate;
import lombok.extern.slf4j.Slf4j;

import static com.bio.bio_backend.global.utils.OidUtils.generateOid;

/**
 * BaseEntity의 createdOid와 updatedOid 필드를 자동으로 설정하는 엔티티 리스너
 */
@Slf4j
public class BaseEntityListener {

    @PrePersist
    public void prePersist(BaseEntity entity) {
        if (entity.getOid() == null) {
            entity.setOid(generateOid());
        }
        
        try {
            String currentUserId = SecurityUtils.getCurrentUserId();
            Long currentUserOid = SecurityUtils.getCurrentUserOid();
            
            if (currentUserOid != null) {
                entity.setCreatedOid(currentUserOid);
                entity.setUpdatedOid(currentUserOid);
            }
            
            if (currentUserId != null) {
                entity.setCreatedId(currentUserId);
                entity.setUpdatedId(currentUserId);
            }
        } catch (SecurityException | IllegalStateException e) {
            log.warn("등록자 정보 설정 실패: {}", e.getMessage());
        } catch (Exception e) {
            log.error("등록자 정보 설정 오류: {}", e.getMessage(), e);
        }
    }

    @PreUpdate
    public void preUpdate(BaseEntity entity) {
        try {
            String currentUserId = SecurityUtils.getCurrentUserId();
            Long currentUserOid = SecurityUtils.getCurrentUserOid();
            
            if (currentUserOid != null) {
                entity.setUpdatedOid(currentUserOid);
            }
            
            if (currentUserId != null) {
                entity.setUpdatedId(currentUserId);
            }
        } catch (SecurityException | IllegalStateException e) {
            log.warn("수정자 정보 설정 실패: {}", e.getMessage());
        } catch (Exception e) {
            log.error("수정자 정보 설정 오류: {}", e.getMessage(), e);
        }
    }
}
