package main

import (
	"fmt"

	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
)

//type User struct {
//	ID        uint   `gorm:"primaryKey"`
//	Name      string `gorm:"size:100"`
//	Email     string `gorm:"size:100;unique"`
//	Age       int
//	Active    bool `gorm:"default:true"`
//	CreatedAt time.Time
//}

func main() {
	db, _ := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
	db.AutoMigrate(&User{})

	// 插入测试数据
	users := []User{
		{Name: "Alice", Email: "alice@example.com", Age: 30, Active: true},
		{Name: "Bob", Email: "bob@example.com", Age: 25, Active: false},
		{Name: "Charlie", Email: "charlie@example.com", Age: 35, Active: true},
		{Name: "David", Email: "david@example.com", Age: 28, Active: true},
	}
	db.Create(users)

	// 1. 多条件查询
	var result1 []User
	db.Where("age > ? AND active = ?", 25, true).Find(&result1)
	fmt.Printf("Age > 25 AND active: %d users\n", len(result1))

	// 2. OR 查询
	var result2 []User
	db.Where("age < ? OR active = ?", 30, false).Find(&result2)
	fmt.Printf("Age < 30 OR inactive: %d users\n", len(result2))

	// 3. 模糊查询
	var result3 []User
	db.Where("name LIKE ?", "%li%").Find(&result3)
	fmt.Printf("Name contains 'li': %d users\n", len(result3))

	// 4. 仅查询指定字段
	var result4 []User
	db.Select("name", "email").Find(&result4)
	fmt.Printf("Selected fields: %d users\n", len(result4))
	for _, u := range result4 {
		fmt.Printf("  - %s (%s)\n", u.Name, u.Email)
	}

	// 5. 统计查询
	var count int64
	db.Model(&User{}).Where("active = ?", true).Count(&count)
	fmt.Printf("Active users count: %d\n", count)

	// 6. 聚合查询
	var avgAge float64
	db.Model(&User{}).Select("AVG(age)").Row().Scan(&avgAge)
	fmt.Printf("Average age: %.2f\n", avgAge)

	// 7. 分组查询
	type Result struct {
		Active bool
		Count  int64
	}
	var groupResult []Result
	db.Model(&User{}).Select("active, count(*) as count").Group("active").Scan(&groupResult)
	fmt.Println("Group by active:")
	for _, r := range groupResult {
		fmt.Printf("  Active=%v: %d users\n", r.Active, r.Count)
	}
}
