package db

import (
	"context"
	"database/sql"
	"fmt"
	"regexp"

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

// validDBName matches safe MySQL identifier names: letters, digits, underscores, hyphens.
var validDBName = regexp.MustCompile(`^[A-Za-z0-9_-]+$`)

// ValidateServiceName checks that a service name is safe for use as a SQL identifier.
func ValidateServiceName(name string) error {
	if !validDBName.MatchString(name) {
		return fmt.Errorf("invalid service name %q: must match [A-Za-z0-9_-]+", name)
	}
	return nil
}

// createDatabaseMySQL connects to the instance via MySQL protocol and creates
// a database. All three providers (Zero, Starter, local MySQL) use the same
// MySQL-compatible wire protocol.
func createDatabaseMySQL(ctx context.Context, inst *Instance, dbName string) error {
	if err := ValidateServiceName(dbName); err != nil {
		return err
	}

	dsn := inst.DSN("")

	conn, err := sql.Open("mysql", dsn)
	if err != nil {
		return fmt.Errorf("open mysql connection: %w", err)
	}
	defer conn.Close()

	stmt := fmt.Sprintf("CREATE DATABASE IF NOT EXISTS `%s`", dbName)
	if _, err := conn.ExecContext(ctx, stmt); err != nil {
		return fmt.Errorf("create database %q: %w", dbName, err)
	}
	return nil
}
