package composite

import "encoding/json"

// ─────────────────────────────────────────────────────────────────────────────
// Batch API Types — POST /composite/batch
// Wire format: { "batchRequests": [...], "haltOnError": bool }
// Response: { "hasErrors": bool, "results": [{ "statusCode": int, "result": ... }] }
// ─────────────────────────────────────────────────────────────────────────────

// SubRequest represents a single request within a batch or composite request.
type SubRequest struct {
	Method      string            `json:"method"`
	URL         string            `json:"url"`
	ReferenceID string            `json:"referenceId,omitempty"`
	Body        json.RawMessage   `json:"body,omitempty"`
	HttpHeaders map[string]string `json:"httpHeaders,omitempty"`
}

// BatchRequest represents the top-level body for POST /composite/batch.
type BatchRequest struct {
	BatchRequests []SubRequest `json:"batchRequests"`
	HaltOnError   bool         `json:"haltOnError,omitempty"`
}

// BatchSubResult represents a single subrequest result in POST /composite/batch.
// Wire format key: "result" (not "body").
type BatchSubResult struct {
	StatusCode  int               `json:"statusCode"`
	ReferenceID string            `json:"referenceId,omitempty"`
	Result      interface{}       `json:"result"`
	HttpHeaders map[string]string `json:"httpHeaders,omitempty"`
}

// BatchResponse represents the top-level response for POST /composite/batch.
type BatchResponse struct {
	HasErrors bool             `json:"hasErrors"`
	Results   []BatchSubResult `json:"results"`
}

// ─────────────────────────────────────────────────────────────────────────────
// Composite API Types — POST /composite
// Wire format: { "compositeRequest": [...], "allOrNone": bool }
// Response: { "compositeResponse": [{ "httpStatusCode": int, "body": ... }] }
// ─────────────────────────────────────────────────────────────────────────────

// CompositeSubrequest represents a single subrequest within POST /composite.
type CompositeSubrequest struct {
	Body        json.RawMessage   `json:"body,omitempty"`
	Method      string            `json:"method"`
	URL         string            `json:"url"`
	ReferenceId string            `json:"referenceId"`
	HttpHeaders map[string]string `json:"httpHeaders,omitempty"`
}

// CompositeRequest represents the top-level body for POST /composite.
type CompositeRequest struct {
	AllOrNone        bool                  `json:"allOrNone"`
	CompositeRequest []CompositeSubrequest `json:"compositeRequest"`
}

// CompositeSubResult represents a single subrequest result in POST /composite.
// Wire format key: "body" (not "result"), "httpStatusCode" (not "statusCode").
type CompositeSubResult struct {
	Body           interface{}       `json:"body"`
	HttpHeaders    map[string]string `json:"httpHeaders,omitempty"`
	HttpStatusCode int               `json:"httpStatusCode"`
	ReferenceId    string            `json:"referenceId"`
}

// CompositeResponse represents the top-level response for POST /composite.
type CompositeResponse struct {
	CompositeResponse []CompositeSubResult `json:"compositeResponse"`
}
