package billing

import "time"

type Cadence string

const (
	CadenceMonthly Cadence = "monthly"
	CadenceAnnual  Cadence = "annual"
)

func (c Cadence) IsValid() bool {
	return c == CadenceMonthly || c == CadenceAnnual
}

type Plan string

const (
	PlanFree Plan = "free"
	PlanPro  Plan = "pro"
)

// Subscription is the persisted projection of a Stripe subscription,
// reconciled on every webhook event.
type Subscription struct {
	ID                 string
	NetworkID          string
	StripeCustomerID   string
	Status             string
	PriceID            string
	Cadence            Cadence
	Quantity           int
	CancelAtPeriodEnd  bool
	CurrentPeriodStart time.Time
	CurrentPeriodEnd   time.Time
	CreatedAt          time.Time
	UpdatedAt          time.Time
}

type Status struct {
	Plan              Plan       `json:"plan"`
	PlanStatus        string     `json:"plan_status"`
	Cadence           *Cadence   `json:"cadence"`
	Seats             int        `json:"seats"` // 0 on free plan; sub.Quantity on pro
	CurrentPeriodEnd  *time.Time `json:"current_period_end"`
	CancelAtPeriodEnd bool       `json:"cancel_at_period_end"`
	PriceMonthlyCents int64      `json:"price_monthly_cents"`
	PriceAnnualCents  int64      `json:"price_annual_cents"`
}

type CheckoutParams struct {
	NetworkID    string
	AdminHumanID string
	AdminEmail   string
	Cadence      Cadence
	Seats        int
}
