package sqlite

import (
	"fmt"

	"git.zkcoi.com/zkcoi/meshray/internal/model"
	"github.com/glebarez/sqlite"
	"gorm.io/gorm"
)

// Store SQLite 存储实现（基于 GORM + glebarez/sqlite）
type Store struct {
	db *gorm.DB
}

// New 创建 Store 实例
func New(dbPath string) (*Store, error) {
	// 使用 glebarez/sqlite（纯Go 实现，无需 CGO）
	// 这是 modernc.org/sqlite 的 GORM 适配层
	db, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{})
	if err != nil {
		return nil, fmt.Errorf("初始化数据库失败：%w", err)
	}

	store := &Store{db: db}

	// 自动迁移所有表
	if err := store.AutoMigrate(); err != nil {
		return nil, fmt.Errorf("数据库迁移失败：%w", err)
	}

	// 初始化默认系统设置
	if err := store.initDefaultSettings(); err != nil {
		return nil, fmt.Errorf("初始化系统设置失败：%w", err)
	}

	return store, nil
}

// AutoMigrate 自动创建所有数据表
func (s *Store) AutoMigrate() error {
	return s.db.AutoMigrate(
		&model.Network{},
		&model.Device{},
		&model.Policy{},
		&model.Service{},
		&model.MeshSeed{},
		&model.PendingJoin{},
		&model.AlertRule{},
		&model.AuditLog{},
		&model.User{},
		&model.SystemConfig{},
		&model.DDNSConfig{},
		&model.NetworkMember{},
		&model.SecurityKey{},        // 新增：安全密钥表
		&model.SystemSetting{},      // 新增：系统设置表
		&model.ExternalService{},    // 新增：外部服务表
		&model.DDNSProvider{},       // 新增：DDNS 服务商配置
		&model.DDNSUsage{},          // 新增：DDNS 用途定义
		&model.NetworkDDNSBinding{}, // 新增：网络 DDNS 绑定
		&model.Notification{},       // 新增：通知表
	)
}

// initDefaultSettings 初始化默认系统设置
func (s *Store) initDefaultSettings() error {
	// 检查是否已有系统设置
	var count int64
	if err := s.db.Model(&model.SystemSetting{}).Count(&count).Error; err != nil {
		return err
	}

	// 如果没有记录，创建默认设置
	if count == 0 {
		return s.db.Create(&model.SystemSetting{
			ID:         1,
			ServerPort: 51820,
			LogLevel:   "info",
			LogFormat:  "console",
			MaxBackups: 7,
			MaxAge:     30,
			Theme:      "light",
			Language:   "zh-CN",
		}).Error
	}

	return nil
}

// DB 获取 GORM 数据库连接
func (s *Store) DB() *gorm.DB {
	return s.db
}

// Close 关闭数据库连接
func (s *Store) Close() error {
	sqlDB, err := s.db.DB()
	if err != nil {
		return err
	}
	return sqlDB.Close()
}
