package mysqlbackend

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

	"github.com/everything-on-mysql/cassandra-on-mysql/pkg/metrics"
)

// SchemaVersion returns the current cql_meta schema version value.
func (m *SchemaManager) SchemaVersion(ctx context.Context, user, password string) (string, error) {
	if m == nil || m.poolManager == nil {
		return "", fmt.Errorf("schema manager not initialized")
	}
	conn, release, err := getConn(ctx, m.poolManager, user, password)
	if err != nil {
		return "", err
	}
	if release != nil {
		defer release()
	}

	var version sql.NullString
	const schemaVersionSQL = `
		SELECT version
		FROM cql_meta.schema_version
		WHERE id = 1
	`
	metrics.RecordRequestSQL(ctx, schemaVersionSQL)
	err = conn.QueryRowContext(ctx, schemaVersionSQL).Scan(&version)
	if err == sql.ErrNoRows {
		return "", nil
	}
	if err != nil {
		return "", fmt.Errorf("failed to query cql_meta.schema_version: %w", err)
	}
	if !version.Valid {
		return "", nil
	}
	return version.String, nil
}

// SetSchemaVersion updates the stored cql_meta schema version value.
func (m *SchemaManager) SetSchemaVersion(ctx context.Context, user, password, version string) error {
	if m == nil || m.poolManager == nil {
		return fmt.Errorf("schema manager not initialized")
	}
	conn, release, err := getConn(ctx, m.poolManager, user, password)
	if err != nil {
		return err
	}
	if release != nil {
		defer release()
	}

	if _, err := execContextWithMetrics(ctx, conn, metrics.MySQLOpExecWrite, `
		INSERT INTO cql_meta.schema_version (id, version)
		VALUES (1, ?)
		ON DUPLICATE KEY UPDATE version = VALUES(version), updated_at = CURRENT_TIMESTAMP
	`, version); err != nil {
		return fmt.Errorf("failed to update cql_meta.schema_version: %w", err)
	}
	return nil
}
