package com.qaup.collision.rule.service;

import com.qaup.collision.rule.model.entity.SpatialRule;
import com.qaup.collision.rule.model.enums.RuleCategory;
import com.qaup.collision.rule.model.enums.RuleStatus;
import com.qaup.collision.rule.service.SpatialRuleService.RuleValidationResult;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 规则配置服务接口
 * 提供基本的规则配置管理功能
 * 
 * @author AI Assistant
 * @version 1.0
 * @since 2025-01-17
 */
public interface RuleConfigurationService {

    // ==================== 基础配置功能 ====================

    /**
     * 创建规则配置模板
     * 
     * @param category 规则类别
     * @param name 规则名称
     * @param description 规则描述
     * @return 创建的规则模板
     */
    SpatialRule createRuleTemplate(RuleCategory category, String name, String description);

    /**
     * 克隆现有规则作为新配置
     * 
     * @param sourceRuleId 源规则ID
     * @param newRuleId 新规则ID
     * @param newName 新规则名称
     * @return 克隆的规则
     */
    SpatialRule cloneRuleConfiguration(String sourceRuleId, String newRuleId, String newName);

    /**
     * 更新规则基本信息
     * 
     * @param ruleId 规则ID
     * @param name 新名称
     * @param description 新描述
     * @param priority 新优先级
     * @return 更新是否成功
     */
    boolean updateRuleBasicInfo(String ruleId, String name, String description, Integer priority);

    /**
     * 配置规则时间窗口
     * 
     * @param ruleId 规则ID
     * @param effectiveStartTime 生效开始时间
     * @param effectiveEndTime 生效结束时间
     * @param timePattern 时间模式配置（JSON格式）
     * @return 配置是否成功
     */
    boolean configureRuleTimeWindow(String ruleId, LocalDateTime effectiveStartTime, 
                                    LocalDateTime effectiveEndTime, String timePattern);

    /**
     * 配置规则空间范围
     * 
     * @param ruleId 规则ID
     * @param spatialObjectType 空间对象类型
     * @param relatedObjectId 关联对象ID
     * @param customGeometryWkt 自定义几何形状（WKT格式）
     * @return 配置是否成功
     */
    boolean configureRuleSpatialScope(String ruleId, String spatialObjectType, 
                                      String relatedObjectId, String customGeometryWkt);

    /**
     * 配置规则参数
     * 
     * @param ruleId 规则ID
     * @param parameters 规则参数映射
     * @return 配置是否成功
     */
    boolean configureRuleParameters(String ruleId, Map<String, Object> parameters);

    // ==================== 配置验证功能 ====================

    /**
     * 验证规则配置的完整性
     * 
     * @param ruleId 规则ID
     * @return 验证结果
     */
    RuleValidationResult validateRuleConfiguration(String ruleId);

    /**
     * 批量验证规则配置
     * 
     * @param ruleIds 规则ID列表
     * @return 验证结果映射（规则ID -> 验证结果）
     */
    Map<String, RuleValidationResult> batchValidateRuleConfigurations(List<String> ruleIds);

    /**
     * 检查规则配置冲突
     * 
     * @param ruleId 规则ID
     * @return 冲突的规则列表
     */
    List<SpatialRule> checkConfigurationConflicts(String ruleId);

    /**
     * 验证规则参数的有效性
     * 
     * @param category 规则类别
     * @param parameters 参数映射
     * @return 验证结果
     */
    RuleValidationResult validateRuleParameters(RuleCategory category, Map<String, Object> parameters);

    // ==================== 配置模板管理 ====================

    /**
     * 获取规则类别的默认配置模板
     * 
     * @param category 规则类别
     * @return 默认配置模板
     */
    Map<String, Object> getDefaultConfigurationTemplate(RuleCategory category);

    /**
     * 保存配置模板
     * 
     * @param templateName 模板名称
     * @param category 规则类别
     * @param template 模板配置
     * @return 保存是否成功
     */
    boolean saveConfigurationTemplate(String templateName, RuleCategory category, Map<String, Object> template);

    /**
     * 获取所有可用的配置模板
     * 
     * @param category 规则类别（可选，为null时返回所有类别）
     * @return 配置模板映射（模板名称 -> 模板配置）
     */
    Map<String, Map<String, Object>> getAvailableTemplates(RuleCategory category);

    /**
     * 应用配置模板到规则
     * 
     * @param ruleId 规则ID
     * @param templateName 模板名称
     * @return 应用是否成功
     */
    boolean applyConfigurationTemplate(String ruleId, String templateName);

    // ==================== 配置导入导出 ====================

    /**
     * 导出规则配置
     * 
     * @param ruleId 规则ID
     * @return 配置数据（JSON格式）
     */
    String exportRuleConfiguration(String ruleId);

    /**
     * 批量导出规则配置
     * 
     * @param ruleIds 规则ID列表
     * @return 配置数据（JSON格式）
     */
    String exportRuleConfigurations(List<String> ruleIds);

    /**
     * 导入规则配置
     * 
     * @param configurationJson 配置数据（JSON格式）
     * @return 导入的规则列表
     */
    List<SpatialRule> importRuleConfiguration(String configurationJson);

    /**
     * 从文件导入规则配置
     * 
     * @param filePath 配置文件路径
     * @return 导入的规则数量
     */
    int importRuleConfigurationFromFile(String filePath);

    // ==================== 配置历史管理 ====================

    /**
     * 获取规则配置历史
     * 
     * @param ruleId 规则ID
     * @param limit 返回数量限制
     * @return 配置历史列表
     */
    List<RuleConfigurationHistory> getRuleConfigurationHistory(String ruleId, int limit);

    /**
     * 保存规则配置快照
     * 
     * @param ruleId 规则ID
     * @param changeReason 变更原因
     * @param changedBy 变更人
     * @return 快照是否保存成功
     */
    boolean saveConfigurationSnapshot(String ruleId, String changeReason, String changedBy);

    /**
     * 恢复规则配置到指定版本
     * 
     * @param ruleId 规则ID
     * @param snapshotId 快照ID
     * @param restoredBy 恢复操作人
     * @return 恢复是否成功
     */
    boolean restoreConfigurationFromSnapshot(String ruleId, String snapshotId, String restoredBy);

    // ==================== 配置统计分析 ====================

    /**
     * 获取配置统计信息
     * 
     * @return 配置统计数据
     */
    ConfigurationStatistics getConfigurationStatistics();

    /**
     * 获取最常用的配置参数
     * 
     * @param category 规则类别
     * @param limit 返回数量限制
     * @return 参数使用统计
     */
    Map<String, Long> getMostUsedConfigurationParameters(RuleCategory category, int limit);

    /**
     * 获取配置错误统计
     * 
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 错误统计数据
     */
    Map<String, Long> getConfigurationErrorStatistics(LocalDateTime startTime, LocalDateTime endTime);

    // ==================== 内部类定义 ====================

    /**
     * 规则配置历史记录
     */
    class RuleConfigurationHistory {
        private final String snapshotId;
        private final String ruleId;
        private final LocalDateTime timestamp;
        private final String changeReason;
        private final String changedBy;
        private final String configurationSnapshot;

        public RuleConfigurationHistory(String snapshotId, String ruleId, LocalDateTime timestamp,
                                        String changeReason, String changedBy, String configurationSnapshot) {
            this.snapshotId = snapshotId;
            this.ruleId = ruleId;
            this.timestamp = timestamp;
            this.changeReason = changeReason;
            this.changedBy = changedBy;
            this.configurationSnapshot = configurationSnapshot;
        }

        // Getters
        public String getSnapshotId() { return snapshotId; }
        public String getRuleId() { return ruleId; }
        public LocalDateTime getTimestamp() { return timestamp; }
        public String getChangeReason() { return changeReason; }
        public String getChangedBy() { return changedBy; }
        public String getConfigurationSnapshot() { return configurationSnapshot; }
    }

    /**
     * 配置统计信息
     */
    class ConfigurationStatistics {
        private final long totalConfigurations;
        private final long validConfigurations;
        private final long invalidConfigurations;
        private final Map<RuleCategory, Long> configurationsByCategory;
        private final Map<RuleStatus, Long> configurationsByStatus;
        private final double configurationValidityRate;

        public ConfigurationStatistics(long totalConfigurations, long validConfigurations,
                                       long invalidConfigurations, Map<RuleCategory, Long> configurationsByCategory,
                                       Map<RuleStatus, Long> configurationsByStatus, double configurationValidityRate) {
            this.totalConfigurations = totalConfigurations;
            this.validConfigurations = validConfigurations;
            this.invalidConfigurations = invalidConfigurations;
            this.configurationsByCategory = configurationsByCategory;
            this.configurationsByStatus = configurationsByStatus;
            this.configurationValidityRate = configurationValidityRate;
        }

        // Getters
        public long getTotalConfigurations() { return totalConfigurations; }
        public long getValidConfigurations() { return validConfigurations; }
        public long getInvalidConfigurations() { return invalidConfigurations; }
        public Map<RuleCategory, Long> getConfigurationsByCategory() { return configurationsByCategory; }
        public Map<RuleStatus, Long> getConfigurationsByStatus() { return configurationsByStatus; }
        public double getConfigurationValidityRate() { return configurationValidityRate; }
    }
} 