package aiapm

import "time"

// AICallRecord represents a single AI/LLM API call
type AICallRecord struct {
	ID               string            `json:"id"`
	Timestamp        time.Time         `json:"timestamp"`
	ServiceName      string            `json:"service_name"`
	ProjectID        string            `json:"project_id"`
	Vendor           string            `json:"vendor"`
	Model            string            `json:"model"`
	TokensIn         int               `json:"tokens_in"`
	TokensOut        int               `json:"tokens_out"`
	TokensCacheRead  int               `json:"tokens_cache_read"`
	TokensCacheWrite int               `json:"tokens_cache_write"`
	EstimatedCost    float64           `json:"estimated_cost"`
	LatencyMs        int               `json:"latency_ms"`
	TTFBMs           int               `json:"ttfb_ms"`
	Status           string            `json:"status"`
	ErrorMessage     string            `json:"error_message,omitempty"`
	Stream           bool              `json:"stream"`
	Cached           bool              `json:"cached"`
	Tags             map[string]string `json:"tags,omitempty"`
}

// AICallFilter defines query filters for AI call records
type AICallFilter struct {
	ServiceName string    `json:"service_name"`
	ProjectID   string    `json:"project_id"`
	Vendor      string    `json:"vendor"`
	Model       string    `json:"model"`
	Status      string    `json:"status"`
	From        time.Time `json:"from"`
	To          time.Time `json:"to"`
	Limit       int       `json:"limit"`
	Offset      int       `json:"offset"`
}

// AIUsageSummary aggregated usage statistics
type AIUsageSummary struct {
	TotalCalls       int     `json:"total_calls"`
	TotalTokensIn    int64   `json:"total_tokens_in"`
	TotalTokensOut   int64   `json:"total_tokens_out"`
	TotalCacheRead   int64   `json:"total_cache_read"`
	TotalCacheWrite  int64   `json:"total_cache_write"`
	TotalCost        float64 `json:"total_cost"`
	AvgLatencyMs     float64 `json:"avg_latency_ms"`
	AvgTTFBMs        float64 `json:"avg_ttfb_ms"`
	ErrorCount       int     `json:"error_count"`
	ErrorRate        float64 `json:"error_rate"`
	CacheHitRate     float64 `json:"cache_hit_rate"`
	UniqueModels     int     `json:"unique_models"`
	UniqueVendors    int     `json:"unique_vendors"`
	UniqueServices   int     `json:"unique_services"`
}

// AIModelStats per-model breakdown
type AIModelStats struct {
	Vendor       string  `json:"vendor"`
	Model        string  `json:"model"`
	TotalCalls   int     `json:"total_calls"`
	TotalTokens  int64   `json:"total_tokens"`
	TotalCost    float64 `json:"total_cost"`
	AvgLatencyMs float64 `json:"avg_latency_ms"`
	ErrorCount   int     `json:"error_count"`
	ErrorRate    float64 `json:"error_rate"`
}

// AIVendorStats per-vendor breakdown
type AIVendorStats struct {
	Vendor       string  `json:"vendor"`
	TotalCalls   int     `json:"total_calls"`
	TotalTokens  int64   `json:"total_tokens"`
	TotalCost    float64 `json:"total_cost"`
	AvgLatencyMs float64 `json:"avg_latency_ms"`
	ModelCount   int     `json:"model_count"`
	ErrorCount   int     `json:"error_count"`
	ErrorRate    float64 `json:"error_rate"`
}

// AICostBreakdown cost breakdown by dimension
type AICostBreakdown struct {
	Dimension string  `json:"dimension"` // vendor, model, service, project
	Key       string  `json:"key"`
	Cost      float64 `json:"cost"`
	Calls     int     `json:"calls"`
	Tokens    int64   `json:"tokens"`
}

// TimeseriesPoint a single point in a time series
type TimeseriesPoint struct {
	Timestamp time.Time `json:"timestamp"`
	Value     float64   `json:"value"`
	Count     int       `json:"count"`
}

// IngestRequest payload for the ingest endpoint
type IngestRequest struct {
	Call  *AICallRecord  `json:"call,omitempty"`
	Calls []AICallRecord `json:"calls,omitempty"`
}
