package controller

import (
	"context"
	"errors"

	"github.com/pressly/goose/v3/database"
)

// A StoreController is used by the goose package to interact with a database. This type is a
// wrapper around the Store interface, but can be extended to include additional (optional) methods
// that are not part of the core Store interface.
type StoreController struct{ database.Store }

var _ database.StoreExtender = (*StoreController)(nil)

// NewStoreController returns a new StoreController that wraps the given Store.
//
// If the Store implements the following optional methods, the StoreController will call them as
// appropriate:
//
//   - TableExists(context.Context, DBTxConn) (bool, error)
//
// If the Store does not implement a method, it will either return a [errors.ErrUnsupported] error
// or fall back to the default behavior.
func NewStoreController(store database.Store) *StoreController {
	return &StoreController{store}
}

func (c *StoreController) TableExists(ctx context.Context, db database.DBTxConn) (bool, error) {
	if t, ok := c.Store.(interface {
		TableExists(ctx context.Context, db database.DBTxConn) (bool, error)
	}); ok {
		return t.TableExists(ctx, db)
	}
	return false, errors.ErrUnsupported
}