package model

import "fmt"

type SfReqBody struct {
	Type             int      `json:"type"`
	Types            string   `json:"types"`
	ID               uint64   `json:"id"`
	BillMonth        string   `json:"bill_month"`
	CollectionMonth  string   `json:"collection_month"`
	CollectionStatus string   `json:"collection_status"`
	StartDate        string   `json:"start_date"`
	Limit            int      `json:"limit,omitempty"`
	OrderIDs         []uint64 `json:"order_ids,omitempty"`
	DeferActivation  bool     `json:"defer_activation,omitempty"`
}

func (r SfReqBody) ValidateLastMonthBatchScope() error {
	if r.Limit < 0 {
		return fmt.Errorf("limit must be greater than or equal to zero")
	}
	if r.Limit > 0 && len(r.OrderIDs) > 0 {
		return fmt.Errorf("limit and order_ids cannot be used together")
	}
	if r.Type != Order && (r.Limit > 0 || len(r.OrderIDs) > 0 || r.DeferActivation) {
		return fmt.Errorf("limit, order_ids, and defer_activation are supported only for order sync")
	}

	seen := make(map[uint64]struct{}, len(r.OrderIDs))
	for _, id := range r.OrderIDs {
		if id == 0 {
			return fmt.Errorf("order_ids must contain only non-zero ids")
		}
		if _, ok := seen[id]; ok {
			return fmt.Errorf("order_ids contains duplicate id %d", id)
		}
		seen[id] = struct{}{}
	}

	return nil
}

type SfSyncResult struct {
	Type               string `json:"type,omitempty"`
	ID                 uint64 `json:"id,omitempty"`
	Status             string `json:"status"`
	Message            string `json:"message,omitempty"`
	OrderID            string `json:"order_id,omitempty"`
	OrderNumber        string `json:"order_number,omitempty"`
	OrderNumberSource  string `json:"order_number_source,omitempty"`
	OrderItemID        string `json:"order_item_id,omitempty"`
	ReadyStatus        string `json:"ready_status,omitempty"`
	ActivationStatus   string `json:"activation_status,omitempty"`
	ActivationError    string `json:"activation_error,omitempty"`
	ActivationAttempts int    `json:"activation_attempts,omitempty"`
}

const (
	Order = iota + 1
	Revrec
	Collection
)
