package com.ruoyi.blockchain.service;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

import com.ruoyi.blockchain.domain.SmartContract;

/**
 * 智能合约服务接口
 * 
 * 实现智能合约部署、执行和升级机制
 * 实现资金分配和支付优先级的智能合约逻辑
 * 添加合约安全审计、权限控制和Gas优化
 * 实现Oracle数据源集成和外部数据验证
 * 添加合约执行监控、异常处理和回滚机制
 * 
 * @author ruoyi
 */
public interface SmartContractService {
    
    // ==================== 合约部署和管理 ====================
    
    /**
     * 部署智能合约
     * 
     * @param contractName 合约名称
     * @param contractCode 合约代码
     * @param contractAbi 合约ABI
     * @param constructorParams 构造函数参数
     * @return 合约地址
     */
    String deployContract(String contractName, String contractCode, String contractAbi, Object... constructorParams);
    
    /**
     * 升级智能合约
     * 
     * @param contractAddress 原合约地址
     * @param newContractCode 新合约代码
     * @param newContractAbi 新合约ABI
     * @param migrationData 迁移数据
     * @return 新合约地址
     */
    String upgradeContract(String contractAddress, String newContractCode, String newContractAbi, Map<String, Object> migrationData);
    
    /**
     * 执行智能合约方法
     * 
     * @param contractAddress 合约地址
     * @param methodName 方法名
     * @param params 参数
     * @return 执行结果
     */
    String executeContract(String contractAddress, String methodName, Object... params);
    
    /**
     * 查询智能合约状态
     * 
     * @param contractAddress 合约地址
     * @param methodName 查询方法名
     * @param params 参数
     * @return 查询结果
     */
    Object queryContract(String contractAddress, String methodName, Object... params);
    
    // ==================== 资金分配和支付优先级 ====================
    
    /**
     * 创建资金分配合约
     * 
     * @param escrowAccountId 监管账户ID
     * @param totalAmount 总金额
     * @param priorityRules 优先级规则
     * @return 合约地址
     */
    String createFundAllocationContract(Long escrowAccountId, BigDecimal totalAmount, Map<String, Object> priorityRules);
    
    /**
     * 执行资金分配
     * 
     * @param contractAddress 合约地址
     * @param allocationPlan 分配计划
     * @return 分配结果
     */
    Map<String, Object> executeFundAllocation(String contractAddress, Map<String, Object> allocationPlan);
    
    /**
     * 设置支付优先级
     * 
     * @param contractAddress 合约地址
     * @param priorityLevel 优先级等级
     * @param recipient 收款方
     * @param amount 金额
     * @return 设置结果
     */
    boolean setPaymentPriority(String contractAddress, Integer priorityLevel, String recipient, BigDecimal amount);
    
    /**
     * 执行优先级支付
     * 
     * @param contractAddress 合约地址
     * @param availableAmount 可用金额
     * @return 支付结果
     */
    Map<String, Object> executePriorityPayment(String contractAddress, BigDecimal availableAmount);
    
    // ==================== 安全审计和权限控制 ====================
    
    /**
     * 执行合约安全审计
     * 
     * @param contractCode 合约代码
     * @param contractAbi 合约ABI
     * @return 审计结果
     */
    Map<String, Object> auditContractSecurity(String contractCode, String contractAbi);
    
    /**
     * 设置合约权限
     * 
     * @param contractAddress 合约地址
     * @param userAddress 用户地址
     * @param permissions 权限列表
     * @return 设置结果
     */
    boolean setContractPermissions(String contractAddress, String userAddress, List<String> permissions);
    
    /**
     * 检查合约权限
     * 
     * @param contractAddress 合约地址
     * @param userAddress 用户地址
     * @param operation 操作
     * @return 权限检查结果
     */
    boolean checkContractPermission(String contractAddress, String userAddress, String operation);
    
    /**
     * 优化Gas使用
     * 
     * @param contractAddress 合约地址
     * @param methodName 方法名
     * @param params 参数
     * @return 优化建议
     */
    Map<String, Object> optimizeGasUsage(String contractAddress, String methodName, Object... params);
    
    // ==================== Oracle数据源集成 ====================
    
    /**
     * 注册Oracle数据源
     * 
     * @param oracleName Oracle名称
     * @param oracleAddress Oracle地址
     * @param dataType 数据类型
     * @param updateInterval 更新间隔
     * @return 注册结果
     */
    boolean registerOracle(String oracleName, String oracleAddress, String dataType, Long updateInterval);
    
    /**
     * 从Oracle获取数据
     * 
     * @param oracleName Oracle名称
     * @param dataKey 数据键
     * @return 数据值
     */
    Object getOracleData(String oracleName, String dataKey);
    
    /**
     * 验证Oracle数据
     * 
     * @param oracleName Oracle名称
     * @param dataKey 数据键
     * @param expectedValue 期望值
     * @return 验证结果
     */
    boolean validateOracleData(String oracleName, String dataKey, Object expectedValue);
    
    /**
     * 更新Oracle数据
     * 
     * @param oracleName Oracle名称
     * @param dataKey 数据键
     * @param dataValue 数据值
     * @param signature 数据签名
     * @return 更新结果
     */
    boolean updateOracleData(String oracleName, String dataKey, Object dataValue, String signature);
    
    // ==================== 监控和异常处理 ====================
    
    /**
     * 监控合约执行
     * 
     * @param contractAddress 合约地址
     * @param monitorConfig 监控配置
     * @return 监控ID
     */
    String startContractMonitoring(String contractAddress, Map<String, Object> monitorConfig);
    
    /**
     * 停止合约监控
     * 
     * @param monitorId 监控ID
     * @return 停止结果
     */
    boolean stopContractMonitoring(String monitorId);
    
    /**
     * 获取合约执行状态
     * 
     * @param contractAddress 合约地址
     * @param txHash 交易哈希
     * @return 执行状态
     */
    Map<String, Object> getContractExecutionStatus(String contractAddress, String txHash);
    
    /**
     * 回滚合约执行
     * 
     * @param contractAddress 合约地址
     * @param txHash 交易哈希
     * @param rollbackReason 回滚原因
     * @return 回滚结果
     */
    boolean rollbackContractExecution(String contractAddress, String txHash, String rollbackReason);
    
    /**
     * 处理合约异常
     * 
     * @param contractAddress 合约地址
     * @param exception 异常信息
     * @param recoveryAction 恢复动作
     * @return 处理结果
     */
    Map<String, Object> handleContractException(String contractAddress, Exception exception, String recoveryAction);
    
    // ==================== 合约生命周期管理 ====================
    
    /**
     * 暂停合约
     * 
     * @param contractAddress 合约地址
     * @param reason 暂停原因
     * @return 暂停结果
     */
    boolean pauseContract(String contractAddress, String reason);
    
    /**
     * 恢复合约
     * 
     * @param contractAddress 合约地址
     * @return 恢复结果
     */
    boolean resumeContract(String contractAddress);
    
    /**
     * 销毁合约
     * 
     * @param contractAddress 合约地址
     * @param reason 销毁原因
     * @return 销毁结果
     */
    boolean destroyContract(String contractAddress, String reason);
    
    /**
     * 获取合约信息
     * 
     * @param contractAddress 合约地址
     * @return 合约信息
     */
    SmartContract getContractInfo(String contractAddress);
    
    /**
     * 获取合约列表
     * 
     * @param contractType 合约类型
     * @param contractStatus 合约状态
     * @return 合约列表
     */
    List<SmartContract> getContractList(String contractType, String contractStatus);
}