package countalert

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

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

func openDB(driverName string, runnable func(db *sql.DB)) {
	// Load .env file
	err := godotenv.Load()
	if err != nil {
		log.Printf("Warning: Unable to load .env file: %v", err)
	}

	// Use default values if environment variables are not set
	host := os.Getenv("TIDB_HOST")
	if host == "" {
		host = "localhost"
	}
	port := os.Getenv("TIDB_PORT")
	if port == "" {
		port = "4000"
	}
	user := os.Getenv("TIDB_USER")
	if user == "" {
		user = "root"
	}
	password := os.Getenv("TIDB_PASSWORD")
	if password == "" {
		password = "" // Default empty password
	}
	dbName := os.Getenv("TIDB_DB_NAME")
	if dbName == "" {
		dbName = "test"
	}
	tls := os.Getenv("USE_SSL")
	if tls == "" {
		tls = "false"
	}

	// Display current database configuration
	log.Printf("Using database configuration:")
	log.Printf("TIDB_HOST: %s", host)
	log.Printf("TIDB_PORT: %s", port)
	log.Printf("TIDB_USER: %s", user)
	log.Printf("TIDB_DB_NAME: %s", dbName)
	log.Printf("TIDB_PASSWORD: %s", "***")

	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&tls=%s",
		user, password, host, port, dbName, tls)
	log.Printf("Attempting to connect to database: %s@%s:%s/%s", user, host, port, dbName)

	db, err := sql.Open(driverName, dsn)
	if err != nil {
		log.Printf("Database connection error: %v", err)
		return
	}
	defer db.Close()

	// Test connection
	err = db.Ping()
	if err != nil {
		log.Printf("Database ping failed: %v", err)
		return
	}

	log.Println("Database connection successful")
	runnable(db)
}

func AddAlert(alertRuleFromErrorlog, alertRuleFromTCOC int) bool {
	result := true
	openDB("mysql", func(db *sql.DB) {
		insertSQL := "INSERT INTO alert_num (alert_rule_from_errorlog,alert_rule_from_tcoc,update_time) VALUES (?, ?, ?)"
		_, err := db.Exec(insertSQL, alertRuleFromErrorlog, alertRuleFromTCOC, time.Now().Add(8*time.Hour))
		if err != nil {
			log.Printf("Database insert error: %v", err)
			result = false
		}
	})
	return result
}
