package coredb

import (
	"context"
	"testing"
)

type contractRowStub struct{}

func (contractRowStub) Scan(...any) error {
	return nil
}

type contractRowsStub struct{}

func (*contractRowsStub) Close() {}

func (*contractRowsStub) Err() error {
	return nil
}

func (*contractRowsStub) Next() bool {
	return false
}

func (*contractRowsStub) Scan(...any) error {
	return nil
}

type contractResultStub struct {
	rowsAffected int64
}

func (result contractResultStub) RowsAffected() int64 {
	return result.rowsAffected
}

type contractTxStub struct{}

func (*contractTxStub) QueryRow(context.Context, string, ...any) Row {
	return contractRowStub{}
}

func (*contractTxStub) Query(context.Context, string, ...any) (Rows, error) {
	return &contractRowsStub{}, nil
}

func (*contractTxStub) Exec(context.Context, string, ...any) (Result, error) {
	return contractResultStub{rowsAffected: 1}, nil
}

func (*contractTxStub) Commit(context.Context) error {
	return nil
}

func (*contractTxStub) Rollback(context.Context) error {
	return nil
}

type contractDBStub struct{}

func (*contractDBStub) QueryRow(context.Context, string, ...any) Row {
	return contractRowStub{}
}

func (*contractDBStub) Query(context.Context, string, ...any) (Rows, error) {
	return &contractRowsStub{}, nil
}

func (*contractDBStub) Exec(context.Context, string, ...any) (Result, error) {
	return contractResultStub{rowsAffected: 1}, nil
}

func (*contractDBStub) BeginTx(context.Context, TxOptions) (Tx, error) {
	return &contractTxStub{}, nil
}

func TestMinimalStorageContractsCompileAgainstCapabilityInterfaces(t *testing.T) {
	t.Parallel()

	var _ Row = contractRowStub{}
	var _ Rows = (*contractRowsStub)(nil)
	var _ Result = contractResultStub{}
	var _ Tx = (*contractTxStub)(nil)
	var _ DB = (*contractDBStub)(nil)
}

func TestRuntimeAdaptersStillSatisfyStorageContracts(t *testing.T) {
	t.Parallel()

	var _ DB = (*tidbAdminDB)(nil)
	var _ Tx = (*sqlTxAdapter)(nil)
	var _ Rows = (*sqlRowsAdapter)(nil)
}
