package initialize

import (
	"fmt"

	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
)

// Plugin 插件接口 (v1版本)
type Plugin interface {
	// Register 注册路由
	Register(group *gin.RouterGroup)
	// RouterPath 返回路由路径
	RouterPath() string
}

// PluginV2 插件接口 (v2版本)
type PluginV2 interface {
	// Register 注册到引擎
	Register(engine *gin.Engine)
}

// PluginManager 插件管理器
type PluginManager struct {
	db          *gorm.DB
	pluginsV1   []Plugin
	pluginsV2   []PluginV2
	initialized bool
}

// NewPluginManager 创建插件管理器
func NewPluginManager(db *gorm.DB) *PluginManager {
	return &PluginManager{
		db:        db,
		pluginsV1: make([]Plugin, 0),
		pluginsV2: make([]PluginV2, 0),
	}
}

// RegisterPluginV1 注册V1版本插件
func (m *PluginManager) RegisterPluginV1(plugin Plugin) {
	m.pluginsV1 = append(m.pluginsV1, plugin)
}

// RegisterPluginV2 注册V2版本插件
func (m *PluginManager) RegisterPluginV2(plugin PluginV2) {
	m.pluginsV2 = append(m.pluginsV2, plugin)
}

// InstallPlugins 安装所有插件
func (m *PluginManager) InstallPlugins(privateGroup *gin.RouterGroup, publicGroup *gin.RouterGroup, engine *gin.Engine) {
	if m.db == nil {
		fmt.Println("项目暂未初始化，无法安装插件，初始化后重启项目即可完成插件安装")
		return
	}

	// 安装V1版本插件
	m.installPluginsV1(privateGroup, publicGroup)

	// 安装V2版本插件
	m.installPluginsV2(engine)

	m.initialized = true
}

// installPluginsV1 安装V1版本插件
func (m *PluginManager) installPluginsV1(privateGroup *gin.RouterGroup, publicGroup *gin.RouterGroup) {
	for _, plugin := range m.pluginsV1 {
		fmt.Printf("%s 注册开始!\n", plugin.RouterPath())
		pluginGroup := privateGroup.Group(plugin.RouterPath())
		plugin.Register(pluginGroup)
		fmt.Printf("%s 注册成功!\n", plugin.RouterPath())
	}
}

// installPluginsV2 安装V2版本插件
func (m *PluginManager) installPluginsV2(engine *gin.Engine) {
	for _, plugin := range m.pluginsV2 {
		plugin.Register(engine)
	}
}

// PluginInit 初始化V1版本插件（兼容旧版方式）
func PluginInit(group *gin.RouterGroup, plugins ...Plugin) {
	for _, plugin := range plugins {
		fmt.Printf("%s 注册开始!\n", plugin.RouterPath())
		pluginGroup := group.Group(plugin.RouterPath())
		plugin.Register(pluginGroup)
		fmt.Printf("%s 注册成功!\n", plugin.RouterPath())
	}
}

// PluginInitV2 初始化V2版本插件（兼容旧版方式）
func PluginInitV2(engine *gin.Engine, plugins ...PluginV2) {
	for _, plugin := range plugins {
		plugin.Register(engine)
	}
}
