package com.cim.idm.config;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

/**
 * 日志切面类，用于记录方法的执行情况
 */
@Aspect
@Component
public class LogAspect {

    private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);

    /**
     * 定义切点，匹配Service中的所有方法
     */
    @Pointcut("execution(* com.cim.idm.service.Impl.*Impl.*(..))")
    public void logPointCut() {}

    /**
     * 环绕通知，记录方法执行前后的信息
     *
     * @param joinPoint 切入点
     * @return 方法返回值
     * @throws Throwable 如果方法抛出异常，则重新抛出
     */
    @Around("logPointCut()")
    @Transactional // 添加事务管理
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();
        try {
            // 记录方法执行前的日志
            logger.info("Method Name : {}", joinPoint.getSignature().getName());
            logger.info("Class Name : {}", joinPoint.getTarget().getClass().getName());
            logger.info("Arguments : {}", joinPoint.getArgs());

            // 执行目标方法
            Object result = joinPoint.proceed();

            // 记录方法执行后的日志
            logger.info("Result : {}", result);

            return result;
        } catch (Throwable e) {
            // 捕获异常并记录错误日志
            logger.error("Exception in {} occurred.", joinPoint.getSignature().getName(), e);
            throw e;
        } finally {
            // 记录方法执行时间
            long endTime = System.currentTimeMillis();
            logger.info("Execution Time : {} ms", (endTime - startTime));
        }
    }
}