package com.ruoyi.blockchain.mapper;

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

/**
 * 智能合约Mapper接口
 * 
 * @author ruoyi
 * @date 2025-12-17
 */
public interface SmartContractMapper 
{
    /**
     * 查询智能合约
     * 
     * @param contractId 智能合约主键
     * @return 智能合约
     */
    public SmartContract selectSmartContractByContractId(Long contractId);

    /**
     * 根据合约名称查询智能合约
     * 
     * @param contractName 合约名称
     * @return 智能合约
     */
    public SmartContract selectSmartContractByContractName(String contractName);

    /**
     * 根据合约地址查询智能合约
     * 
     * @param contractAddress 合约地址
     * @return 智能合约
     */
    public SmartContract selectSmartContractByContractAddress(String contractAddress);

    /**
     * 根据部署交易哈希查询智能合约
     * 
     * @param deployTxHash 部署交易哈希
     * @return 智能合约
     */
    public SmartContract selectSmartContractByDeployTxHash(String deployTxHash);

    /**
     * 查询智能合约列表
     * 
     * @param smartContract 智能合约
     * @return 智能合约集合
     */
    public List<SmartContract> selectSmartContractList(SmartContract smartContract);

    /**
     * 根据合约类型查询智能合约
     * 
     * @param contractType 合约类型
     * @return 智能合约集合
     */
    public List<SmartContract> selectSmartContractByType(String contractType);

    /**
     * 根据合约状态查询智能合约
     * 
     * @param contractStatus 合约状态
     * @return 智能合约集合
     */
    public List<SmartContract> selectSmartContractByStatus(String contractStatus);

    /**
     * 根据部署者地址查询智能合约
     * 
     * @param deployerAddress 部署者地址
     * @return 智能合约集合
     */
    public List<SmartContract> selectSmartContractByDeployerAddress(String deployerAddress);

    /**
     * 根据时间范围查询智能合约
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 智能合约集合
     */
    public List<SmartContract> selectSmartContractByDateRange(@Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询活跃的智能合约
     * 
     * @return 智能合约集合
     */
    public List<SmartContract> selectActiveSmartContracts();

    /**
     * 统计合约数量按类型分组
     * 
     * @return 统计结果
     */
    public List<java.util.Map<String, Object>> selectContractCountByType();

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

    /**
     * 新增智能合约
     * 
     * @param smartContract 智能合约
     * @return 结果
     */
    public int insertSmartContract(SmartContract smartContract);

    /**
     * 修改智能合约
     * 
     * @param smartContract 智能合约
     * @return 结果
     */
    public int updateSmartContract(SmartContract smartContract);

    /**
     * 更新合约状态
     * 
     * @param contractId 合约ID
     * @param contractStatus 合约状态
     * @return 结果
     */
    public int updateContractStatus(@Param("contractId") Long contractId, @Param("contractStatus") String contractStatus);

    /**
     * 更新部署信息
     * 
     * @param contractId 合约ID
     * @param deployTxHash 部署交易哈希
     * @param deployTime 部署时间
     * @param deployerAddress 部署者地址
     * @return 结果
     */
    public int updateDeployInfo(@Param("contractId") Long contractId, 
                                @Param("deployTxHash") String deployTxHash,
                                @Param("deployTime") Date deployTime,
                                @Param("deployerAddress") String deployerAddress);

    /**
     * 删除智能合约
     * 
     * @param contractId 智能合约主键
     * @return 结果
     */
    public int deleteSmartContractByContractId(Long contractId);

    /**
     * 批量删除智能合约
     * 
     * @param contractIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteSmartContractByContractIds(Long[] contractIds);

    /**
     * 校验合约名称是否唯一
     * 
     * @param contractName 合约名称
     * @return 结果
     */
    public SmartContract checkContractNameUnique(String contractName);

    /**
     * 校验合约地址是否唯一
     * 
     * @param contractAddress 合约地址
     * @return 结果
     */
    public SmartContract checkContractAddressUnique(String contractAddress);
}