package com.gzzm.lobster.audit;

import com.gzzm.lobster.common.IdGenerator;
import com.gzzm.lobster.common.JsonUtil;
import com.gzzm.lobster.identity.UserContext;
import com.gzzm.platform.commons.Tools;
import net.cyan.arachne.annotation.Service;
import net.cyan.nest.annotation.Inject;

import java.util.Date;
import java.util.Map;

/**
 * AuditService —— 通用审计服务 / Generic audit service.
 */
@Service
public class AuditService {

    @Inject
    private AuditLogDao auditLogDao;

    /** thunwind DAO 跨线程保护 —— 详见 feedback_thunwind_dao_thread_binding */
    private AuditLogDao auditLogDao() {
        try {
            AuditLogDao d = Tools.getBean(AuditLogDao.class);
            if (d != null) return d;
        } catch (Throwable ignore) { /* fallback */ }
        return auditLogDao;
    }

    public void record(UserContext user, String threadId, String runId,
                       String actionType, String targetType, String targetRef,
                       String result, Map<String, Object> detail) {
        try {
            AuditLog log = new AuditLog();
            log.setAuditId(IdGenerator.auditId());
            log.setUserId(user == null ? null : user.getUserId());
            log.setDeptId(user == null ? null : user.getDeptId());
            log.setOrgId(user == null ? null : user.getOrgId());
            log.setThreadId(threadId);
            log.setRunId(runId);
            log.setActionType(actionType);
            log.setTargetType(targetType);
            log.setTargetRef(targetRef);
            log.setResult(result);
            if (detail != null && !detail.isEmpty()) {
                String json = JsonUtil.toJson(detail);
                if (json.length() > 3800) json = json.substring(0, 3800) + "...";
                log.setDetailJson(json);
            }
            log.setCreateTime(new Date());
            auditLogDao().save(log);
        } catch (Throwable t) {
            try { Tools.log("[AuditService] save failed", t); } catch (Throwable ignore) { /* ignore */ }
        }
    }
}
