package com.flowable.devops.workflow.plugin;

import com.flowable.devops.entity.NodeType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

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

/**
 * 插件描述符
 * 
 * 包含插件的完整元数据和运行时信息
 * 
 * @author Flowable Team
 * @since 1.0.0
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PluginDescriptor {
    
    /**
     * 插件唯一ID
     */
    private String id;
    
    /**
     * 插件名称
     */
    private String name;
    
    /**
     * 插件显示名称
     */
    private String displayName;
    
    /**
     * 插件版本
     */
    private String version;
    
    /**
     * 插件作者
     */
    private String author;
    
    /**
     * 插件描述
     */
    private String description;
    
    /**
     * 节点分类
     */
    private NodeType.NodeCategory category;
    
    /**
     * 节点图标
     */
    private String icon;
    
    /**
     * 是否启用
     */
    private Boolean enabled;
    
    /**
     * 插件来源
     */
    private PluginSource source;
    
    /**
     * 插件JAR文件路径（仅外部插件）
     */
    private String jarPath;
    
    /**
     * 插件实现类名
     */
    private String implementationClass;
    
    /**
     * 类加载器（仅外部插件，用于热加载和隔离）
     */
    private transient ClassLoader classLoader;
    
    /**
     * 依赖的其他插件
     * 格式：pluginId:version
     */
    private List<String> dependencies;
    
    /**
     * 所需的最低平台版本
     */
    private String minPlatformVersion;
    
    /**
     * 插件主页
     */
    private String homepage;
    
    /**
     * 许可证
     */
    private String license;
    
    /**
     * 节点类型元数据（完整的字段定义、输出结构等）
     */
    private NodeType metadata;
    
    /**
     * 插件状态
     */
    private PluginStatus status;
    
    /**
     * 错误信息（如果状态为ERROR）
     */
    private String errorMessage;
    
    /**
     * 插件安装时间
     */
    private LocalDateTime installedAt;
    
    /**
     * 插件加载时间
     */
    private LocalDateTime loadedAt;
    
    /**
     * 插件更新时间
     */
    private LocalDateTime updatedAt;
    
    /**
     * 插件来源
     */
    public enum PluginSource {
        /**
         * 内置插件（编译在classpath中）
         */
        INTERNAL,
        
        /**
         * 外部插件（从JAR文件加载）
         */
        EXTERNAL
    }
    
    /**
     * 插件状态
     */
    public enum PluginStatus {
        /**
         * 已加载（但未激活）
         */
        LOADED,
        
        /**
         * 活跃（正常运行）
         */
        ACTIVE,
        
        /**
         * 已禁用
         */
        DISABLED,
        
        /**
         * 错误状态
         */
        ERROR
    }
    
    /**
     * 检查插件是否可用
     */
    public boolean isAvailable() {
        return enabled != null && enabled && 
               (status == PluginStatus.ACTIVE || status == PluginStatus.LOADED);
    }
    
    /**
     * 检查插件是否为内置插件
     */
    public boolean isInternal() {
        return source == PluginSource.INTERNAL;
    }
    
    /**
     * 检查插件是否为外部插件
     */
    public boolean isExternal() {
        return source == PluginSource.EXTERNAL;
    }
}
