package com.example.demo.event;

import com.example.demo.model.UserEvent;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.boot.context.event.ApplicationReadyEvent;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 事件监听器 - 演示如何监听事件
 * 
 * 学习点：
 * - @EventListener 注解
 * - @Async 异步处理
 * - 多监听器协作
 * - 事件驱动架构的优势
 */
@Component
public class UserEventListener {
    
    // 存储事件历史（演示用）
    private final List<UserEvent> eventHistory = new CopyOnWriteArrayList<>();
    
    /**
     * 监听用户事件 - 日志记录
     */
    @EventListener
    public void handleUserEvent(UserEvent event) {
        System.out.println("[EventListener] 收到事件: " + event.getType() + 
            " - 用户: " + event.getUserName() + 
            " - 时间: " + event.getTimestamp());
        
        // 记录到历史
        eventHistory.add(event);
    }
    
    /**
     * 监听用户创建事件 - 发送欢迎邮件（模拟）
     */
    @EventListener(condition = "#event.type == T(com.example.demo.model.UserEvent$Type).CREATED")
    @Async
    public void handleUserCreated(UserEvent event) {
        System.out.println("[EmailService] 发送欢迎邮件给: " + event.getUserName());
        // 模拟邮件发送耗时
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        System.out.println("[EmailService] 欢迎邮件发送完成");
    }
    
    /**
     * 监听用户登录事件 - 更新登录统计
     */
    @EventListener(condition = "#event.type == T(com.example.demo.model.UserEvent$Type).LOGIN")
    public void handleUserLogin(UserEvent event) {
        System.out.println("[LoginTracker] 记录用户登录: " + event.getUserName());
    }
    
    /**
     * 监听应用启动完成事件
     */
    @EventListener
    public void onApplicationReady(ApplicationReadyEvent event) {
        System.out.println("[EventListener] Spring Boot 应用启动完成！");
    }
    
    /**
     * 获取事件历史
     */
    public List<UserEvent> getEventHistory() {
        return new ArrayList<>(eventHistory);
    }
}