package client

import (
	commonAPI "code.secondbit.org/api.hg"
	"code.secondbit.org/auth.hg"

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

func (c *Client) CreateSubscription(change subscriptions.SubscriptionChange) (subscriptions.Subscription, error) {
	resp, err := c.Post("/subscriptions/", change, auth.Scopes{api.ScopeSubscription, api.ScopeSubscriptionAdmin}.Strings(), change.UserID)
	if err != nil {
		hErr, ok := err.(httpErrors)
		if ok {
			for _, e := range hErr {
				if e.Slug == commonAPI.RequestErrConflict &&
					e.Field == "/user_id" {
					return subscriptions.Subscription{}, subscriptions.ErrSubscriptionAlreadyExists
				} else if e.Slug == commonAPI.RequestErrConflict &&
					e.Field == "/stripe_token" {
					return subscriptions.Subscription{}, subscriptions.ErrStripeSubscriptionAlreadyExists
				}
			}
		}
		return subscriptions.Subscription{}, err
	}
	if len(resp.Subscriptions) < 1 {
		return subscriptions.Subscription{}, subscriptions.ErrSubscriptionNotFound
	}
	return resp.Subscriptions[0], nil
}

func (c *Client) UpdateSubscription(change subscriptions.SubscriptionChange) (subscriptions.Subscription, error) {
	resp, err := c.Patch("/subscriptions/"+change.UserID.String(), change, auth.Scopes{api.ScopeSubscription, api.ScopeSubscriptionAdmin}.Strings(), change.UserID)
	if err != nil {
		return subscriptions.Subscription{}, err
	}
	if len(resp.Subscriptions) < 1 {
		return subscriptions.Subscription{}, subscriptions.ErrSubscriptionNotFound
	}
	return resp.Subscriptions[0], nil
}
