package main

import (
	"errors"
	"fmt"
	"log"

	"github.com/spf13/viper"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func main() {
	// 初始化 Viper
	viper.SetConfigName("config") // 配置文件名称（不带扩展名）
	viper.SetConfigType("toml")   // 配置文件类型
	viper.AddConfigPath(".")      // 配置文件路径
	if err := viper.ReadInConfig(); err != nil {
		log.Fatalf("Error reading config file: %v", err)
	}

	// 获取 database 配置
	database := map[string]string{
		"user":     viper.GetString("mysql.user"),
		"password": viper.GetString("mysql.password"),
		"host":     viper.GetString("mysql.host"),
		"port":     viper.GetString("mysql.port"),
		"database": viper.GetString("mysql.database"),
	}

	// 打印 database 配置
	fmt.Println("Database Config:", database)

	// 构建 DSN（数据源名称）
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		database["user"],
		database["password"],
		database["host"],
		database["port"],
		database["database"],
	)

	// 连接数据库
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatalf("Failed to connect to database: %v", err)
	}

	// 打印 db 对象
	fmt.Println("Database connection successful:", db)

	//自动迁移表结构
	if err := db.AutoMigrate(&User{}); err != nil {
		fmt.Println("Auto migration failed:", err)
	}

	fmt.Println("Auto migration successful!")
	//创建
	user := User{
		Name: "John",
		Age:  30,
	}
	if err := db.Create(&user).Error; err != nil {
		log.Fatalf("Failed to create user: %v", err)
	}
	fmt.Println("User created successfully!")
	//搜索数据
	//单一搜索
	var user1, user2, user3 User
	if err := db.First(&user1, 1).Error; err != nil {
		log.Fatalf("Failed to find user: %v", err)
	}
	user2.Name = "Jane"
	if err = db.First(&user2).Error; err != nil {
		log.Fatalf("Failed to find user: %v", err)
	}
	if err := db.Where("name = ?", "Alice").First(&user3); err != nil {
		log.Fatalf("Failed to find user: %v", err)
	}
	//查询多条记录
	var users []User
	if err := db.Where("age > ?", 20).Find(&users); err != nil {
		log.Fatalf("Failed to find users: %v", err)
	}
	// 查询时避免RecordNotFound错误
	err = db.Where("name = ?", "Bob").First(&user).Error
	if errors.Is(err, gorm.ErrRecordNotFound) {
		fmt.Println("User not found")
	}
	//更新（UPDATE）
	db.Model(&user).Update("Age", 40)
	// 更新多个字段（零值需使用map）
	db.Model(&user).Updates(map[string]interface{}{"Age": 30, "Name": ""})
	// 使用结构体更新（忽略零值）
	db.Model(&user).Updates(User{Name: "Alice", Age: 0}) // Age不会被更新
	//更新（SAVE）
	db.Save(&user)              //更新所有字段
	db.Save(&user).Omit("Name") //更新除Name字段外的所有字段
	//删除
	db.Delete(&user)            //软删除
	db.Unscoped().Delete(&user) //直接强制删除
}

// 定义 User 模型
type User struct {
	gorm.Model
	Name string
	Age  int
}
