package mysqlbackend

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

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

type sqlQueryer interface {
	QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error)
}

type sqlExecer interface {
	ExecContext(context.Context, string, ...interface{}) (sql.Result, error)
}

func queryContextWithMetrics(ctx context.Context, queryer sqlQueryer, op string, query string, args ...interface{}) (*sql.Rows, error) {
	metrics.RecordRequestSQL(ctx, query, args...)
	start := time.Now()
	rows, err := queryer.QueryContext(ctx, query, args...)
	d := time.Since(start)
	metrics.ObserveMySQLOperation(ctx, op, err == nil, d)
	return rows, err
}

func execContextWithMetrics(ctx context.Context, execer sqlExecer, op string, query string, args ...interface{}) (sql.Result, error) {
	metrics.RecordRequestSQL(ctx, query, args...)
	start := time.Now()
	result, err := execer.ExecContext(ctx, query, args...)
	d := time.Since(start)
	metrics.ObserveMySQLOperation(ctx, op, err == nil, d)
	return result, err
}
