package sample_data

import (
	"crypto/tls"
	"crypto/x509"
	"database/sql"
	"fmt"
	"time"

	"github.com/avast/retry-go/v4"
	"github.com/go-sql-driver/mysql"
)

func Connect2TiDB(user, password, host, port string, caCert, database string) (*sql.DB, error) {
	// Create a certificate pool and add the CA certificate
	rootCertPool := x509.NewCertPool()
	if !rootCertPool.AppendCertsFromPEM([]byte(caCert)) {
		return nil, fmt.Errorf("AppendCertsFromPEM failed")
	}

	// Configure TLS
	mysqlTLSConfig := &tls.Config{
		RootCAs:            rootCertPool,
		ServerName:         host,
		MinVersion:         tls.VersionTLS12,
		InsecureSkipVerify: true,
	}

	// Register the TLS config
	err := mysql.RegisterTLSConfig("custom-tls", mysqlTLSConfig)
	if err != nil {
		return nil, fmt.Errorf("failed to register TLS config: %s", err.Error())
	}

	// MySQL DSN (Replace placeholders with actual values)
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?tls=custom-tls", user, password, host, port, database)

	// Connect to MySQL
	var db *sql.DB
	err = retry.Do(func() error {
		opened, sqlerr := sql.Open("mysql", dsn)
		if sqlerr != nil {
			return fmt.Errorf("failed to open MySQL connection: %s", sqlerr.Error())
		}
		db = opened
		return nil
	}, retry.DelayType(retry.FixedDelay), retry.Delay(time.Second*10), retry.Attempts(6))
	if err != nil {
		return nil, fmt.Errorf("failed to open MySQL connection: %s", err.Error())
	}

	// Check the connection
	err = db.Ping()
	if err != nil {
		return nil, fmt.Errorf("failed to connect to MySQL connection: %s", err.Error())
	}
	return db, nil
}

func Connect2MySQL(user, password, endpoint, database string, tlsEnabled bool) (*sql.DB, error) {
	// MySQL DSN (Replace placeholders with actual values)
	dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s", user, password, endpoint, database)

	if tlsEnabled {
		rootCertPool, err := x509.SystemCertPool()
		if err != nil {
			return nil, fmt.Errorf("failed to get system cert pool: %w", err)
		}
		// Configure TLS
		mysqlTLSConfig := &tls.Config{
			RootCAs: rootCertPool,
		}

		// Register the TLS config
		tlsKey := "system-tls"
		if err = mysql.RegisterTLSConfig(tlsKey, mysqlTLSConfig); err != nil {
			return nil, fmt.Errorf("failed to register TLS config: %s", err.Error())
		}
		dsn += "?tls=" + tlsKey
	}

	// Connect to MySQL
	var db *sql.DB
	err := retry.Do(func() error {
		opened, sqlerr := sql.Open("mysql", dsn)
		if sqlerr != nil {
			return fmt.Errorf("failed to open MySQL connection: %s", sqlerr.Error())
		}
		db = opened
		return nil
	}, retry.DelayType(retry.FixedDelay), retry.Delay(time.Second*10), retry.Attempts(6))
	if err != nil {
		return nil, fmt.Errorf("failed to open MySQL connection: %s", err.Error())
	}

	// Check the connection
	err = db.Ping()
	if err != nil {
		return nil, fmt.Errorf("failed to connect to MySQL connection: %s", err.Error())
	}
	return db, nil
}
