package main

import (
	"crypto/tls"
	"database/sql"
	"flag"
	"fmt"
	"log"
	"os"

	"github.com/go-sql-driver/mysql"
	"github.com/nexuscrm/backend/internal/bootstrap"
	"github.com/nexuscrm/backend/internal/infrastructure/database"
)

func main() {
	host := os.Getenv("TIDB_HOST")
	port := os.Getenv("TIDB_PORT")
	user := os.Getenv("TIDB_USER")
	password := os.Getenv("TIDB_PASSWORD")
	dbName := os.Getenv("TIDB_DATABASE")

	if host == "" {
		host = "127.0.0.1"
	}
	if port == "" {
		port = "4000"
	}
	if dbName == "" {
		dbName = "nexuscrm"
	}

	// Step 1: Create database (connect without DB name)
	useTLS := flag.Bool("tls", false, "Enable TLS for the initial database connection")
	flag.Parse()

	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/", user, password, host, port)
	if *useTLS {
		tlsConfig := &tls.Config{MinVersion: tls.VersionTLS12, ServerName: host}
		mysql.RegisterTLSConfig("setup-tls", tlsConfig)
		dsn += "?tls=setup-tls"
	}
	rawDB, err := sql.Open("mysql", dsn)
	if err != nil {
		log.Fatalf("Failed to open DB: %v", err)
	}
	if err := rawDB.Ping(); err != nil {
		log.Fatalf("Failed to ping DB: %v", err)
	}
	if _, err := rawDB.Exec("CREATE DATABASE IF NOT EXISTS " + dbName); err != nil {
		log.Fatalf("Failed to create database: %v", err)
	}
	rawDB.Close()
	fmt.Printf("Database '%s' ensured.\n", dbName)

	// Step 2: Bootstrap schema tables
	conn, err := database.GetInstance()
	if err != nil {
		log.Fatalf("Failed to connect to %s: %v", dbName, err)
	}
	defer conn.Close()

	if err := bootstrap.InitializeSchema(conn); err != nil {
		log.Fatalf("Failed to bootstrap schema: %v", err)
	}

	// Ensure new columns exist on core metadata tables that may predate this version.
	ensureColumns := []string{
		"ALTER TABLE `_System_Object` ADD COLUMN IF NOT EXISTS `DeleteMode` VARCHAR(50) NULL",
		"ALTER TABLE `_System_Session` ADD COLUMN IF NOT EXISTS `GrantType` VARCHAR(50) NULL",
	}
	for _, ddl := range ensureColumns {
		if _, err := conn.DB().Exec(ddl); err != nil {
			log.Printf("⚠️  %v (may already exist)", err)
		}
	}

	fmt.Println("Schema bootstrap complete.")
}
