package main

import (
	"database/sql"
	"fmt"

	_ "github.com/go-sql-driver/mysql"
)

// 全局变量
var (
	// 数据库连接配置
	DBUsername = "root"                                            // 用户名
	DBPassword = "Long6166@@"                                      // 密码
	DBHost     = "nj-cynosdbmysql-grp-1v6vxn5f.sql.tencentcdb.com" // 主机
	DBPort     = 26247                                             // 端口
	DBDataBase = "book_center"                                     // 数据库
	DBCharset  = "utf8mb4"                                         // 字符集

	//连接池配置
	MaxOpenConns = 20
	MaxIdleConns = 10
)

// 连接数据库
func connectDB() (*sql.DB, error) {
	// 数据源名称格式
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=True&loc=Local",
		DBUsername,
		DBPassword,
		DBHost,
		DBPort,
		DBDataBase,
		DBCharset)
	// 连接数据库
	db, err := sql.Open("mysql", dsn)
	if err != nil {
		return nil, fmt.Errorf("打开数据库连接失败: %v", err)
	}
	// 设置连接池参数
	db.SetMaxOpenConns(MaxOpenConns) // 最大打开连接数
	db.SetMaxIdleConns(MaxIdleConns) // 最大空闲连接数
	// 测试链接
	err = db.Ping()
	if err != nil {
		return nil, fmt.Errorf("数据库连接测试失败: %v", err)
	}
	return db, nil
}

func selectBookIsbn(db *sql.DB, bookId int) error {
	//// 执行语句
	//query := `SELECT isbn, MAX(create_time) as max_create_time
	//FROM shop_goods_rejection
	//WHERE isbn IS NOT NULL
	//GROUP BY isbn`
	//
	//exec, err := db.Exec(query)
	//fmt.Println(exec, err)
	return nil
}

//func main() {
//db, err := connectDB()
//if err != nil {
//	log.Fatal("数据库连接失败:", err)
//}
//
//books, err := GetAllCategoryBooks()
//if err != nil {
//	fmt.Printf("", err)
//}
//if len(books) == 0 {
//	fmt.Printf("数组是空！")
//}
//// 查询数据库中不存在的ISBN
//missingISBNs, err := findMissingISBNs(db, books)
//if err != nil {
//	log.Fatal("查询失败:", err)
//}
//log.Printf("数据库中不存在的ISBN数量: %d", len(missingISBNs))
//fmt.Println("数据库中不存在的ISBN数组:")
//for i, isbn := range missingISBNs {
//	fmt.Printf("%d. %s\n", i+1, isbn)
//}
//
//missingISBNsString := strings.Join(missingISBNs, "\n")
//
//// 这里您可以将 missingISBNs 数组用于后续处理
//// 比如保存到文件、插入到另一个表等
//fmt.Printf("\n新的missingISBNs字符串: %v\n", missingISBNsString)
//}

// 查询数据库中不存在的ISBN
func findMissingISBNs(db *sql.DB, books []string) ([]string, error) {
	if len(books) == 0 {
		return []string{}, nil
	}

	// 查询数据库中存在的ISBN
	existingISBNs, err := queryExistingISBNs(db, books)
	if err != nil {
		return nil, err
	}

	// 创建现有ISBN的映射，用于快速查找
	existingMap := make(map[string]bool)
	for _, isbn := range existingISBNs {
		existingMap[isbn] = true
	}

	// 创建新数组，存储数据库中不存在的ISBN
	missingISBNs := make([]string, 0)
	for _, isbn := range books {
		if !existingMap[isbn] {
			missingISBNs = append(missingISBNs, isbn)
		}
	}

	return missingISBNs, nil
}

// 查询数据库中存在的ISBN
func queryExistingISBNs(db *sql.DB, isbns []string) ([]string, error) {
	if len(isbns) == 0 {
		return []string{}, nil
	}

	// 分批处理，避免SQL语句过长
	batchSize := 1000
	allExistingISBNs := make([]string, 0)

	for i := 0; i < len(isbns); i += batchSize {
		end := i + batchSize
		if end > len(isbns) {
			end = len(isbns)
		}

		batchISBNs := isbns[i:end]
		batchExisting, err := queryBatchISBNs(db, batchISBNs)
		if err != nil {
			return nil, err
		}
		allExistingISBNs = append(allExistingISBNs, batchExisting...)
	}

	return allExistingISBNs, nil
}

// 批量查询ISBN
func queryBatchISBNs(db *sql.DB, isbns []string) ([]string, error) {
	if len(isbns) == 0 {
		return []string{}, nil
	}
	// 构建IN查询的占位符
	placeholders := make([]string, len(isbns))
	args := make([]interface{}, len(isbns))
	for i, isbn := range isbns {
		placeholders[i] = "?"
		args[i] = isbn
	}
	query := fmt.Sprintf(`
        SELECT isbn 
        FROM book_center 
        WHERE isbn IN (%s) 
        AND del_flag = 0
    `, joinPlaceholders(placeholders, ","))

	rows, err := db.Query(query, args...)
	if err != nil {
		return nil, fmt.Errorf("查询数据库失败: %v", err)
	}
	defer rows.Close()

	var existingISBNs []string
	for rows.Next() {
		var isbn string
		if err := rows.Scan(&isbn); err != nil {
			return nil, fmt.Errorf("扫描结果失败: %v", err)
		}
		existingISBNs = append(existingISBNs, isbn)
	}

	if err := rows.Err(); err != nil {
		return nil, fmt.Errorf("遍历结果失败: %v", err)
	}

	return existingISBNs, nil
}

// joinPlaceholders 连接占位符
func joinPlaceholders(placeholders []string, sep string) string {
	if len(placeholders) == 0 {
		return ""
	}

	result := placeholders[0]
	for i := 1; i < len(placeholders); i++ {
		result += sep + placeholders[i]
	}
	return result
}
