package organization

import (
	"context"
	"fmt"

	"github.com/tidbcloud/AgentTeam/internal/coredb"
)

func requireCurrentTx(queryer coredb.QueryExecer) (coredb.Tx, error) {
	tx, ok := queryer.(coredb.Tx)
	if !ok || tx == nil {
		return nil, fmt.Errorf("organization txstore requires current coredb.Tx")
	}
	return tx, nil
}

func withTx(ctx context.Context, queryer coredb.QueryExecer, fn func(coredb.Tx) error) error {
	_ = ctx
	tx, err := requireCurrentTx(queryer)
	if err != nil {
		return err
	}
	return fn(tx)
}

func withTxValue[T any](ctx context.Context, queryer coredb.QueryExecer, fn func(coredb.Tx) (T, error)) (T, error) {
	_ = ctx
	tx, err := requireCurrentTx(queryer)
	if err != nil {
		var zero T
		return zero, err
	}
	return fn(tx)
}

func withTx2[A any, B any](ctx context.Context, queryer coredb.QueryExecer, fn func(coredb.Tx) (A, B, error)) (A, B, error) {
	_ = ctx
	tx, err := requireCurrentTx(queryer)
	if err != nil {
		var zeroA A
		var zeroB B
		return zeroA, zeroB, err
	}
	return fn(tx)
}
