// SPDX-FileCopyrightText: 2022 Free Mobile
// SPDX-License-Identifier: AGPL-3.0-only

package cmd

import (
	"net/http"
	"runtime"
	runtimedebug "runtime/debug"
	"slices"
	"strings"

	"github.com/gin-gonic/gin"
	"github.com/spf13/cobra"

	"akvorado/common/helpers"
	"akvorado/common/reporter"
	"akvorado/common/schema"
)

func init() {
	RootCmd.AddCommand(versionCmd)
}

var versionCmd = &cobra.Command{
	Use:   "version",
	Short: "Print version",
	Long:  `Display version and build information about akvorado.`,
	RunE: func(cmd *cobra.Command, _ []string) error {
		cmd.Printf("akvorado %s\n", helpers.AkvoradoVersion)
		cmd.Printf("  Built with: %s\n", runtime.Version())
		if info, ok := runtimedebug.ReadBuildInfo(); ok {
			for _, setting := range info.Settings {
				if strings.HasPrefix(setting.Key, "GO") {
					cmd.Printf("  Build setting %s=%s\n", setting.Key, setting.Value)
				}
			}
		}
		if !debug {
			return nil
		}
		cmd.Println()

		sch, err := schema.New(schema.DefaultConfiguration())
		if err != nil {
			return err
		}
		cmd.Println("Can be disabled:")
		for k := schema.ColumnTimeReceived; k < schema.ColumnLast; k++ {
			column, ok := sch.LookupColumnByKey(k)
			if ok && !column.Disabled && !column.NoDisable && !slices.Contains(sch.ClickHousePrimaryKeys(), column.Name) {
				cmd.Printf("- %s\n", column.Name)
			}
		}
		cmd.Println()
		cmd.Println("Can be enabled:")
		for k := schema.ColumnTimeReceived; k < schema.ColumnLast; k++ {
			column, ok := sch.LookupColumnByKey(k)
			if ok && column.Disabled {
				cmd.Printf("- %s", column.Name)
				if column.ClickHouseMainOnly {
					cmd.Print(" (main table only)")
				}
				cmd.Println()
			}
		}
		return nil
	},
}

func versionHandler(c *gin.Context) {
	c.JSON(http.StatusOK, gin.H{
		"version":  helpers.AkvoradoVersion,
		"compiler": runtime.Version(),
	})
}

func versionMetrics(r *reporter.Reporter) {
	r.GaugeVec(reporter.GaugeOpts{
		Name: "info",
		Help: "Akvorado build information",
	}, []string{"version", "compiler"}).
		WithLabelValues(helpers.AkvoradoVersion, runtime.Version()).Set(1)
}
