package com.zioinfo.cms.admin;

import com.zioinfo.cms.admin.dto.AuditLog;
import com.zioinfo.cms.admin.mapper.AuditLogMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 감사 로그 서비스 — 콘텐츠 게시·관리자 작업·UGC 모더레이션 등 주요 변경을 cms_audit_log 에 기록.
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class AuditService {

    private final AuditLogMapper mapper;

    /** 현재 인증 주체(username)로 감사 로그를 기록한다. */
    public void log(String action, String target, String detail) {
        log(currentActor(), action, target, detail);
    }

    public void log(String actor, String action, String target, String detail) {
        try {
            AuditLog entry = new AuditLog();
            entry.setActor(actor);
            entry.setAction(action);
            entry.setTarget(target);
            entry.setDetail(detail);
            mapper.insert(entry);
        } catch (Exception e) {
            // 감사 기록 실패가 업무 흐름을 끊지 않도록 — 경고만
            log.warn("감사 로그 기록 실패 [{}]: {}", action, e.getMessage());
        }
    }

    public List<AuditLog> find(String action, String actor, int limit) {
        int safeLimit = (limit <= 0 || limit > 1000) ? 100 : limit;
        return mapper.find(action, actor, safeLimit);
    }

    /** SecurityContext 의 JWT subject(username)를 추출. 없으면 system. */
    public static String currentActor() {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (auth != null && auth.getName() != null && !auth.getName().isBlank()) {
            return auth.getName();
        }
        return "system";
    }
}
