package dto

import "time"

// InstantQueryRequest is the request for instant query (/api/v1/query)
// Compatible with Prometheus API
type InstantQueryRequest struct {
	ClusterID string    `json:"-"`                      // From URL path
	Query     string    `json:"query" form:"query"`     // PromQL expression
	Time      time.Time `json:"time" form:"time"`       // Evaluation timestamp (optional, defaults to now)
	Timeout   string    `json:"timeout" form:"timeout"` // Evaluation timeout (optional)
}

// RangeQueryRequest is the request for range query (/api/v1/query_range)
// Compatible with Prometheus API
type RangeQueryRequest struct {
	ClusterID string        `json:"-"`                      // From URL path
	Query     string        `json:"query" form:"query"`     // PromQL expression
	Start     time.Time     `json:"start" form:"start"`     // Start timestamp
	End       time.Time     `json:"end" form:"end"`         // End timestamp
	Step      time.Duration `json:"step" form:"step"`       // Query resolution step width
	Timeout   string        `json:"timeout" form:"timeout"` // Evaluation timeout (optional)
}

// PrometheusResponse is the standard Prometheus API response format
type PrometheusResponse struct {
	Status    string               `json:"status"`              // "success" or "error"
	Data      interface{}          `json:"data,omitempty"`      // Query result data
	ErrorType string               `json:"errorType,omitempty"` // Error type when status is "error"
	Error     string               `json:"error,omitempty"`     // Error message when status is "error"
	Code      string               `json:"code,omitempty"`      // Stable Clinic error code when classified
	Details   *MetricsErrorDetails `json:"details,omitempty"`   // Safe structured error metadata
	Warnings  []string             `json:"warnings,omitempty"`  // Optional warnings
	// Routing fields are set by MetricsQueryService for observability (not serialized).
	DeployTypeV2 string `json:"-"`
	Provider     string `json:"-"`
	Region       string `json:"-"`
	// UpstreamStatus is transport metadata for canonical facade status mapping.
	// Legacy Prometheus routes ignore it and retain their established behavior.
	UpstreamStatus int `json:"-"`
}

// MetricsErrorDetails contains safe metadata for a classified upstream error.
type MetricsErrorDetails struct {
	UpstreamStatus    int    `json:"upstreamStatus"`
	UpstreamErrorType string `json:"upstreamErrorType,omitempty"`
	Retryable         bool   `json:"retryable"`
}

// SeriesRequest is the request for series query (/api/v1/series)
// Compatible with Prometheus API
type SeriesRequest struct {
	ClusterID string    `json:"-"`                      // From URL path
	Match     []string  `json:"match[]" form:"match[]"` // Series selector (at least one required)
	Start     time.Time `json:"start" form:"start"`     // Start timestamp (optional)
	End       time.Time `json:"end" form:"end"`         // End timestamp (optional)
}

// ServerlessParentInstantQueryRequest is the request for parent/control-plane instant metrics queries.
// Compatible with Prometheus API, with control_plane_info used only for routing.
type ServerlessParentInstantQueryRequest struct {
	ControlPlaneInfo string    `json:"control_plane_info" form:"control_plane_info"`
	Query            string    `json:"query" form:"query"`
	Time             time.Time `json:"time" form:"time"`
	Timeout          string    `json:"timeout" form:"timeout"`
}

// ServerlessParentRangeQueryRequest is the request for parent/control-plane range metrics queries.
type ServerlessParentRangeQueryRequest struct {
	ControlPlaneInfo string        `json:"control_plane_info" form:"control_plane_info"`
	Query            string        `json:"query" form:"query"`
	Start            time.Time     `json:"start" form:"start"`
	End              time.Time     `json:"end" form:"end"`
	Step             time.Duration `json:"step" form:"step"`
	Timeout          string        `json:"timeout" form:"timeout"`
}

// ServerlessParentSeriesRequest is the request for parent/control-plane series queries.
type ServerlessParentSeriesRequest struct {
	ControlPlaneInfo string    `json:"control_plane_info" form:"control_plane_info"`
	Match            []string  `json:"match[]" form:"match[]"`
	Start            time.Time `json:"start" form:"start"`
	End              time.Time `json:"end" form:"end"`
}

// MetricCategory defines which prometheus endpoint to use for a metric
type MetricCategory string

const (
	MetricCategoryCluster   MetricCategory = "cluster"
	MetricCategoryDataPlane MetricCategory = "dataplane"
)
