package plan

import (
	"context"

	"github.com/shopspring/decimal"
	"github.com/tech/sendico/payments/storage/model"
)

// RouteStore exposes routing definitions for plan construction.
type RouteStore interface {
	List(ctx context.Context, filter *model.PaymentRouteFilter) (*model.PaymentRouteList, error)
}

// GatewayRegistry exposes gateway instances for capability-based selection.
type GatewayRegistry interface {
	List(ctx context.Context) ([]*model.GatewayInstanceDescriptor, error)
}

type SendDirection = sendDirection

const (
	SendDirectionAny SendDirection = sendDirectionAny
	SendDirectionOut SendDirection = sendDirectionOut
	SendDirectionIn  SendDirection = sendDirectionIn
)

func RailFromEndpoint(endpoint model.PaymentEndpoint, attrs map[string]string, isSource bool) (model.Rail, string, error) {
	return railFromEndpoint(endpoint, attrs, isSource)
}

func ResolveRouteNetwork(attrs map[string]string, sourceNetwork, destNetwork string) (string, error) {
	return resolveRouteNetwork(attrs, sourceNetwork, destNetwork)
}

func SendDirectionForRail(rail model.Rail) SendDirection {
	return sendDirectionForRail(rail)
}

func IsGatewayEligible(gw *model.GatewayInstanceDescriptor, rail model.Rail, network, currency string, action model.RailOperation, dir SendDirection, amount decimal.Decimal) error {
	return model.IsGatewayEligible(gw, rail, network, currency, action, toGatewayDirection(dir), amount)
}

func ParseRailValue(value string) model.Rail {
	return parseRailValue(value)
}

func NetworkFromEndpoint(endpoint model.PaymentEndpoint) string {
	return networkFromEndpoint(endpoint)
}
