package svc

import (
	"time"

	sysModel "sundynix-micro-go/app/system/model"
	"sundynix-micro-go/app/system/rpc/internal/config"

	"github.com/zeromicro/go-zero/core/logx"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type ServiceContext struct {
	Config config.Config
	DB     *gorm.DB
}

func NewServiceContext(c config.Config) *ServiceContext {
	db, err := gorm.Open(mysql.Open(c.DB.DataSource), &gorm.Config{})
	if err != nil {
		logx.Errorf("[system-rpc] ❌ 连接数据库失败: %v", err)
		panic(err)
	}

	// 配置连接池，防止高并发耗尽连接
	sqlDB, err := db.DB()
	if err != nil {
		logx.Errorf("[system-rpc] ❌ 获取底层 DB 失败: %v", err)
		panic(err)
	}
	sqlDB.SetMaxOpenConns(100)
	sqlDB.SetMaxIdleConns(20)
	sqlDB.SetConnMaxLifetime(time.Hour)
	logx.Infof("[system-rpc] ✅ 数据库连接成功 | MaxOpen=100 MaxIdle=20")

	// 自动迁移
	tables := []interface{}{
		&sysModel.SundynixClient{},
		&sysModel.SundynixRole{},
		&sysModel.SundynixMenu{},
		&sysModel.SundynixRoleMenu{},
		&sysModel.SundynixOperationRecord{},
		&sysModel.SundynixDict{},
		&sysModel.SundynixUser{},
		&sysModel.SundynixUserRole{},
	}
	if err := db.AutoMigrate(tables...); err != nil {
		logx.Errorf("[system-rpc] ⚠️  数据库迁移失败: %v", err)
	} else {
		logx.Infof("[system-rpc] ✅ 数据库迁移完成 | 表数量: %d", len(tables))
	}

	return &ServiceContext{
		Config: c,
		DB:     db,
	}
}
