package database

import (
	"database/sql"
	"fmt"
	"os"

	_ "modernc.org/sqlite"
)

var DB *sql.DB

// InitDB 初始化数据库
func InitDB(dbPath string) error {
	var err error

	// 确保数据库目录存在
	dir := "./data"
	if _, err := os.Stat(dir); os.IsNotExist(err) {
		os.MkdirAll(dir, 0755)
	}

	// 打开数据库连接
	DB, err = sql.Open("sqlite", dbPath)
	if err != nil {
		return fmt.Errorf("打开数据库失败: %w", err)
	}

	// 创建表
	err = createTables()
	if err != nil {
		return fmt.Errorf("创建表失败: %w", err)
	}

	return nil
}

//	PlaceholderDownPrice float64  `json:"placeholderDownPrice"` // 占位降价 默认0.01
//	MinShippingFee       float64  `json:"minShippingFee"`       // 最低运费
//	MinPrice             float64  `json:"minPrice"`             // 最低书价
//
// createTables 创建数据表
func createTables() error {
	sql := `
	CREATE TABLE IF NOT EXISTS goods_pricing (
		id INTEGER PRIMARY KEY AUTOINCREMENT,
		isbn TEXT,
		book_name TEXT,
		author TEXT,
		publishing TEXT,
		out_id TEXT,
		quality TEXT,
		query_index INTEGER DEFAULT 0,
		user_id TEXT,
		price REAL,
		shipping_fee REAL,
		placeholder_down_price REAL, 			   -- 占位降价
    	min_shipping_fee REAL,                     -- 最低运费
    	min_price REAL,                            -- 最低书价
    	final_price REAL,                          -- 最终价格
 		fail_count INTEGER DEFAULT 0,
		created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
		updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
	);

	CREATE TABLE IF NOT EXISTS kfz_token (
		id INTEGER PRIMARY KEY AUTOINCREMENT,
		username TEXT NOT NULL,
		token TEXT NOT NULL,
		is_enable INTEGER DEFAULT 1,
		created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
	);

	CREATE INDEX IF NOT EXISTS idx_isbn ON goods_pricing(isbn);
	CREATE INDEX IF NOT EXISTS idx_out_id ON goods_pricing(out_id);

	CREATE TABLE IF NOT EXISTS kfz_config (
		id INTEGER PRIMARY KEY AUTOINCREMENT,
		new_price REAL,
		placeholder_down_price REAL,
		min_shipping_fee REAL,
		min_price REAL,
		query_index INTEGER DEFAULT 0
	);
	`

	_, err := DB.Exec(sql)
	return err
}

// CloseDB 关闭数据库连接
func CloseDB() error {
	if DB != nil {
		return DB.Close()
	}
	return nil
}
