package main

import (
	"encoding/json"
	"fmt"
	"os"

	"github.com/grafana/grafana-foundation-sdk/go/common"
	"github.com/grafana/grafana-foundation-sdk/go/dashboard"
	"github.com/grafana/grafana-foundation-sdk/go/prometheus"
	"github.com/grafana/grafana-foundation-sdk/go/timeseries"
)

func main() {
	builder := dashboard.NewDashboardBuilder("Inference Service API Metrics Dashboard").
		Uid("embedding-api-metrics").
		Tags([]string{"embedding", "api", "metrics", "inference-service"}).
		Refresh("30s").
		Time("now-1h", "now").
		Timezone(common.TimeZoneBrowser).
		WithRow(dashboard.NewRowBuilder("API Success & Failure Rates")).
		WithPanel(
			timeseries.NewPanelBuilder().
				Title("Embedding API Success Rate").
				Unit("percent").
				Min(0).
				Max(100).
				WithTarget(
					prometheus.NewDataqueryBuilder().
						Expr(`sum by (model) (rate(embedding_api_success_total[$__rate_interval])) / (sum by (model) (rate(embedding_api_success_total[$__rate_interval])) + sum by (model) (rate(embedding_api_failure_total[$__rate_interval]))) * 100`).
						LegendFormat("{{ model }} Success Rate"),
				),
		).
		WithPanel(
			timeseries.NewPanelBuilder().
				Title("Embedding API Failure Rate").
				Unit("percent").
				Min(0).
				Max(100).
				WithTarget(
					prometheus.NewDataqueryBuilder().
						Expr(`sum by (model) (rate(embedding_api_failure_total[$__rate_interval])) / (sum by (model) (rate(embedding_api_success_total[$__rate_interval])) + sum by (model) (rate(embedding_api_failure_total[$__rate_interval]))) * 100`).
						LegendFormat("{{ model }} Failure Rate"),
				),
		).
		WithRow(dashboard.NewRowBuilder("API Latency")).
		WithPanel(
			timeseries.NewPanelBuilder().
				Title("Embedding API Latency by Model").
				Unit("s").
				Min(0).
				WithTarget(
					prometheus.NewDataqueryBuilder().
						Expr(`histogram_quantile(0.95, sum by (model, le) (rate(embedding_api_latency_seconds_bucket[$__rate_interval])))`).
						LegendFormat("{{ model }} P95"),
				).
				WithTarget(
					prometheus.NewDataqueryBuilder().
						Expr(`histogram_quantile(0.99, sum by (model, le) (rate(embedding_api_latency_seconds_bucket[$__rate_interval])))`).
						LegendFormat("{{ model }} P99"),
				),
		).
		WithRow(dashboard.NewRowBuilder("API Failures by Reason")).
		WithPanel(
			timeseries.NewPanelBuilder().
				Title("Embedding API Failure Rate by Reason and Model").
				Unit("reqps").
				Min(0).
				WithTarget(
					prometheus.NewDataqueryBuilder().
						Expr(`sum by (model, reason) (rate(embedding_api_failure_total[$__rate_interval]))`).
						LegendFormat("{{ model }} - {{ reason }}"),
				),
		).
		WithRow(dashboard.NewRowBuilder("API Usage")).
		WithPanel(
			timeseries.NewPanelBuilder().
				Title("Embedding API Calls by Model").
				Unit("reqps").
				Min(0).
				WithTarget(
					prometheus.NewDataqueryBuilder().
						Expr(`sum by (model) (rate(embedding_api_success_total[$__rate_interval]))`).
						LegendFormat("{{ model }} Success"),
				).
				WithTarget(
					prometheus.NewDataqueryBuilder().
						Expr(`sum by (model) (rate(embedding_api_failure_total[$__rate_interval]))`).
						LegendFormat("{{ model }} Failure"),
				),
		).
		WithPanel(
			timeseries.NewPanelBuilder().
				Title("Embedding API Used Dollars by Model").
				Unit("$/h").
				Min(0).
				WithTarget(
					prometheus.NewDataqueryBuilder().
						Expr(`sum by (model) (rate(embedding_api_used_micro_dollars_total[$__rate_interval])) * 3600 / 1000000`).
						LegendFormat("{{ model }}"),
				),
		)

	embeddingDashboard, err := builder.Build()
	if err != nil {
		panic(err)
	}

	dashboardJson, err := json.MarshalIndent(embeddingDashboard, "", "  ")
	if err != nil {
		panic(err)
	}

	targetFile := "./dashboard.json"
	if err := os.WriteFile(targetFile, dashboardJson, 0644); err != nil {
		fmt.Printf("Failed to write dashboard to %s: %v\n", targetFile, err)
		return
	}
	fmt.Printf("Grafana dashboard generated successfully: %s\n", targetFile)
	fmt.Println("You can import this JSON into Grafana to create the dashboard.")
}
