package com.ruoyi.blockchain.mapper;

import java.util.Date;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.ruoyi.blockchain.domain.ChainEvent;

/**
 * 链上事件Mapper接口
 * 
 * @author ruoyi
 * @date 2025-12-17
 */
public interface ChainEventMapper 
{
    /**
     * 查询链上事件
     * 
     * @param eventId 链上事件主键
     * @return 链上事件
     */
    public ChainEvent selectChainEventByEventId(Long eventId);

    /**
     * 根据事件名称查询链上事件
     * 
     * @param eventName 事件名称
     * @return 链上事件集合
     */
    public List<ChainEvent> selectChainEventByEventName(String eventName);

    /**
     * 根据合约地址查询链上事件
     * 
     * @param contractAddress 合约地址
     * @return 链上事件集合
     */
    public List<ChainEvent> selectChainEventByContractAddress(String contractAddress);

    /**
     * 根据交易哈希查询链上事件
     * 
     * @param transactionHash 交易哈希
     * @return 链上事件集合
     */
    public List<ChainEvent> selectChainEventByTransactionHash(String transactionHash);

    /**
     * 查询链上事件列表
     * 
     * @param chainEvent 链上事件
     * @return 链上事件集合
     */
    public List<ChainEvent> selectChainEventList(ChainEvent chainEvent);

    /**
     * 根据区块号查询链上事件
     * 
     * @param blockNumber 区块号
     * @return 链上事件集合
     */
    public List<ChainEvent> selectChainEventByBlockNumber(Long blockNumber);

    /**
     * 根据事件状态查询链上事件
     * 
     * @param eventStatus 事件状态
     * @return 链上事件集合
     */
    public List<ChainEvent> selectChainEventByEventStatus(String eventStatus);

    /**
     * 根据处理状态查询链上事件
     * 
     * @param processStatus 处理状态
     * @return 链上事件集合
     */
    public List<ChainEvent> selectChainEventByProcessStatus(String processStatus);

    /**
     * 根据时间范围查询链上事件
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 链上事件集合
     */
    public List<ChainEvent> selectChainEventByDateRange(@Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询待处理的事件
     * 
     * @return 链上事件集合
     */
    public List<ChainEvent> selectPendingEvents();

    /**
     * 统计事件数量按名称分组
     * 
     * @return 统计结果
     */
    public List<java.util.Map<String, Object>> selectEventCountByName();

    /**
     * 统计事件数量按状态分组
     * 
     * @return 统计结果
     */
    public List<java.util.Map<String, Object>> selectEventCountByStatus();

    /**
     * 统计事件数量按合约地址分组
     * 
     * @return 统计结果
     */
    public List<java.util.Map<String, Object>> selectEventCountByContract();

    /**
     * 新增链上事件
     * 
     * @param chainEvent 链上事件
     * @return 结果
     */
    public int insertChainEvent(ChainEvent chainEvent);

    /**
     * 修改链上事件
     * 
     * @param chainEvent 链上事件
     * @return 结果
     */
    public int updateChainEvent(ChainEvent chainEvent);

    /**
     * 更新事件状态
     * 
     * @param eventId 事件ID
     * @param eventStatus 事件状态
     * @return 结果
     */
    public int updateEventStatus(@Param("eventId") Long eventId, @Param("eventStatus") String eventStatus);

    /**
     * 更新处理状态
     * 
     * @param eventId 事件ID
     * @param processStatus 处理状态
     * @param processTime 处理时间
     * @return 结果
     */
    public int updateProcessStatus(@Param("eventId") Long eventId, 
                                   @Param("processStatus") String processStatus,
                                   @Param("processTime") Date processTime);

    /**
     * 删除链上事件
     * 
     * @param eventId 链上事件主键
     * @return 结果
     */
    public int deleteChainEventByEventId(Long eventId);

    /**
     * 批量删除链上事件
     * 
     * @param eventIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteChainEventByEventIds(Long[] eventIds);

    /**
     * 清理指定日期之前的事件
     * 
     * @param beforeDate 指定日期
     * @return 结果
     */
    public int cleanupEventsBeforeDate(@Param("beforeDate") Date beforeDate);
}