package cardissuer

import "context"

type Issuer interface {
	CreateVirtualCard(ctx context.Context, params CreateVirtualCardParams) (CreatedVirtualCard, error)
	FreezeVirtualCard(ctx context.Context, externalCardID string) error
	UnfreezeVirtualCard(ctx context.Context, externalCardID string) error
	CancelVirtualCard(ctx context.Context, externalCardID string) error
	SyncSpendingLimit(ctx context.Context, externalCardID string, spendingLimitCents int64) (LimitSyncResult, error)
}

type CreateVirtualCardParams struct {
	UserID             string
	AccountID          string
	CardholderName     string
	Network            string
	CardType           string
	SpendingLimitCents int64
}

type CreatedVirtualCard struct {
	ExternalCardID string
	Sensitive      SensitiveCard
	PANFingerprint string
	Last4          string
	ExpMonth       int
	ExpYear        int
}

type SensitiveCard struct {
	PAN      string `json:"-"`
	CVV      string `json:"-"`
	ExpMonth int    `json:"-"`
	ExpYear  int    `json:"-"`
}

type OneTimeSensitiveCard struct {
	PAN      string `json:"pan"`
	CVV      string `json:"cvv"`
	ExpMonth int    `json:"exp_month"`
	ExpYear  int    `json:"exp_year"`
}

func (c SensitiveCard) OneTimeDisclosure() OneTimeSensitiveCard {
	return OneTimeSensitiveCard{
		PAN:      c.PAN,
		CVV:      c.CVV,
		ExpMonth: c.ExpMonth,
		ExpYear:  c.ExpYear,
	}
}

func (c SensitiveCard) String() string {
	return "[sensitive card data redacted]"
}

func (c SensitiveCard) GoString() string {
	return c.String()
}

type LimitSyncResult struct {
	ExternalSyncID string
}
