package main

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

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

func main() {
	// Check env vars
	user := getEnv("DB_USER", "autosso")
	pass := getEnv("DB_PASSWORD", "")
	host := getEnv("DB_HOST", "127.0.0.1")
	port := getEnv("DB_PORT", "3306")
	dbname := "security"

	fmt.Printf("\n🔎 CONFIG CHECK:\n")
	fmt.Printf("   User: %s\n", user)
	fmt.Printf("   Host: %s\n", host)
	fmt.Printf("   Port: %s\n", port)
	
	if host == "127.0.0.1" || host == "localhost" {
		fmt.Printf("⚠️  WARNING: Target host is LOCALHOST ('%s').\n", host)
		fmt.Printf("   If your MySQL is on RDS, you must set DB_HOST!\n")
		fmt.Printf("   Example: export DB_HOST='rm-xxx.mysql.rds.aliyuncs.com'\n")
	}

	fmt.Printf("🔍 Debugging Connection for user '%s' on HOST '%s'...\n", user, host)
	
	// Password check
	if pass == "" {
		fmt.Printf("⚠️  DB_PASSWORD is EMPTY! Connection will likely fail with 'using password: NO'.\n")
		fmt.Printf("   Please run: export DB_PASSWORD='your_password'\n\n")
	} else {
		fmt.Printf("🔑 DB_PASSWORD is set (length: %d)\n", len(pass))
	}

	// Test 1: TCP 127.0.0.1
	fmt.Printf("\n--- Test 1: TCP 127.0.0.1:%s ---\n", port)
	testConnection(fmt.Sprintf("%s:%s@tcp(127.0.0.1:%s)/%s?timeout=2s", user, pass, port, dbname))

	// Test 2: TCP localhost (sometimes different permissions)
	fmt.Printf("\n--- Test 2: TCP localhost:%s ---\n", port)
	testConnection(fmt.Sprintf("%s:%s@tcp(localhost:%s)/%s?timeout=2s", user, pass, port, dbname))
	
	// Test 3: Unix Socket (Common on macOS)
	socketPaths := []string{"/tmp/mysql.sock", "/var/run/mysqld/mysqld.sock"}
	for _, sock := range socketPaths {
		if _, err := os.Stat(sock); err == nil {
			fmt.Printf("\n--- Test 3: Unix Socket %s ---\n", sock)
			testConnection(fmt.Sprintf("%s:%s@unix(%s)/%s?timeout=2s", user, pass, sock, dbname))
		}
	}
}

func testConnection(dsn string) {
	db, err := sql.Open("mysql", dsn)
	if err != nil {
		fmt.Printf("❌ Failed to parse DSN: %v\n", err)
		return
	}
	defer db.Close()

	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
	defer cancel()

	err = db.PingContext(ctx)
	if err != nil {
		fmt.Printf("❌ Connection FAILED: %v\n", err)
	} else {
		fmt.Printf("✅ Connection SUCCESSFUL!\n")
	}
}

func getEnv(key, fallback string) string {
	if value, ok := os.LookupEnv(key); ok {
		return value
	}
	return fallback
}

func contains(s, substr string) bool {
	return len(s) >= len(substr) && s[0:len(substr)] == substr // simplistic, but standard strings.Contains is better if imported
}
