package bootstrap

import (
	pkgGorm "github.com/break/junhong_cmp_fiber/pkg/gorm"
	"go.uber.org/zap"
)

// BootstrapResult Bootstrap 初始化结果
type BootstrapResult struct {
	Handlers    *Handlers
	Middlewares *Middlewares
}

// Bootstrap 初始化所有业务组件并返回 Handlers 和 Middlewares
// 这是应用启动时的主入口，负责编排所有组件的初始化流程
//
// 初始化顺序：
//  1. 初始化 Store 层（数据访问）
//  2. 注册 GORM Callbacks（数据权限过滤等）- 需要 AccountStore
//  3. 初始化 Service 层（业务逻辑）
//  4. 初始化默认超级管理员（如果不存在）
//  5. 初始化 Middleware 层（中间件）
//  6. 初始化 Handler 层（HTTP 处理）
//
// 参数：
//   - deps: 基础依赖（DB, Redis, Logger）
//
// 返回：
//   - *BootstrapResult: 包含 Handlers 和 Middlewares
//   - error: 初始化错误
func Bootstrap(deps *Dependencies) (*BootstrapResult, error) {
	// 1. 初始化 Store 层
	stores := initStores(deps)

	// 2. 注册 GORM Callbacks（需要 AccountStore 来查询下级 ID）
	if err := registerGORMCallbacks(deps, stores); err != nil {
		return nil, err
	}

	// 3. 初始化 Service 层
	services := initServices(stores, deps)

	// 4. 初始化默认超级管理员（降级处理：失败不中断启动）
	if err := initDefaultAdmin(deps, services); err != nil {
		deps.Logger.Error("初始化默认超级管理员失败", zap.Error(err))
	}

	// 5. 初始化 Middleware 层（传入 ShopStore 以支持预计算下级店铺 ID）
	middlewares := initMiddlewares(deps, stores)

	// 6. 初始化 Handler 层
	handlers := initHandlers(services, deps)

	return &BootstrapResult{
		Handlers:    handlers,
		Middlewares: middlewares,
	}, nil
}

// registerGORMCallbacks 注册 GORM Callbacks
func registerGORMCallbacks(deps *Dependencies, stores *stores) error {
	// 注册自动添加创建&更新人 Callback
	if err := pkgGorm.RegisterSetCreatorUpdaterCallback(deps.DB); err != nil {
		return err
	}

	// 数据权限过滤已移至 Store 层显式调用 ApplyXxxFilter 函数

	return nil
}
