package generic
import (
"errors"
"strings"
"time"
)
type Plan string
type Mercher interface {
CreateBusiness(signup MercherSignup) (*MercherCustomer, error)
GetPlanExpires(search MercherCustomerIds) (time.Time, error)
}
const (
PlanZero = Plan("zero")
PlanBasic = Plan("basic")
PlanMedium = Plan("medium")
PlanAdvanced = Plan("advanced")
PlanUnbounded = Plan("unbounded")
)
var (
ErrUnrecognizedMercher = errors.New("merchant type not recognized")
)
type MercherCustomerIds struct {
CustomerId string
BusinessName string
Email string
Phone string
}
type MercherSignup struct {
Email string
Firstname string
Lastname string
BusinessName string
DislayName string
AddressCity string
AddressCountry string
AddressLine1 string
AddressLine2 string
AddressPostalCode string
AddressState string
// TaxId string
BusinessTierString string
}
type MercherCustomer struct {
PlanId string
MercherPlanId string
CustomerId string
}
type CustomerId string
type dummy struct{}
func (d *dummy) DoSignup(s MercherSignup) (*MercherCustomer, error) {
return &MercherCustomer{
CustomerId: s.Email + "id",
MercherPlanId: "dummy-plan-id-" + string(d.emailToPlan(s.Email)),
PlanId: "dummy-plan-id-" + string(d.emailToPlan(s.Email)),
}, nil
}
func (*dummy) Delete(s CustomerId) error {
return nil
}
func (*dummy) emailToPlan(email string) Plan {
if strings.Contains(email, string(PlanZero)) {
return PlanZero
} else if strings.Contains(email, string(PlanBasic)) {
return PlanBasic
} else if strings.Contains(email, string(PlanMedium)) {
return PlanMedium
} else if strings.Contains(email, string(PlanAdvanced)) {
return PlanAdvanced
} else if strings.Contains(email, string(PlanUnbounded)) {
return PlanUnbounded
} else {
return PlanBasic
}
}
func (d *dummy) FindByEmail(email string) (MercherCustomer, error) {
return MercherCustomer{
Id: email + "-id",
PlanId: "dummy-plan-id-" + string(d.emailToPlan(email)),
}, nil
}
const (
MercherTypeDummy = "dummy"
)