package api

import (
	"errors"

	"code.secondbit.org/ducky/subscriptions.hg"

	"golang.org/x/net/context"
)

const (
	subscriptionStoreKey = "SubscriptionStore"
	stripeKey            = "Stripe"
)

var (
	ErrSubscriptionStoreNotSet = errors.New("SubscriptionStore not set")
	ErrStripeClientNotSet      = errors.New("Stripe not set")
)

func getSubscriptionStore(c context.Context) (subscriptions.SubscriptionStore, error) {
	store := c.Value(subscriptionStoreKey)
	if store == nil {
		return nil, ErrSubscriptionStoreNotSet
	}
	if s, ok := store.(subscriptions.SubscriptionStore); ok {
		return s, nil
	}
	return nil, ErrSubscriptionStoreNotSet
}

func WithSubscriptionStore(store subscriptions.SubscriptionStore, c context.Context) context.Context {
	return context.WithValue(c, subscriptionStoreKey, store)
}

func getStripeClient(c context.Context) (subscriptions.Stripe, error) {
	stripe := c.Value(stripeKey)
	if stripe == nil {
		return subscriptions.Stripe{}, ErrStripeClientNotSet
	}
	if s, ok := stripe.(subscriptions.Stripe); ok {
		return s, nil
	}
	return subscriptions.Stripe{}, ErrStripeClientNotSet
}

func WithStripeClient(stripe subscriptions.Stripe, c context.Context) context.Context {
	return context.WithValue(c, stripeKey, stripe)
}
