package main

import (
	"context"
	"net/http"
	"time"

	"go.skia.org/infra/go/git"
	"go.skia.org/infra/go/gitiles"
	"go.skia.org/infra/go/metrics2"
	"go.skia.org/infra/go/skerr"
	"go.skia.org/infra/go/sklog"
	"go.skia.org/infra/go/util"
)

const (
	METRIC_LAST_MODIFIED = "liveness_last_file_modification_s"
)

func updateLastModifiedMetrics(ctx context.Context, client *http.Client, reposToFiles map[*gitiles.Repo][]string) error {
	now := time.Now()
	for repo, files := range reposToFiles {
		for _, file := range files {
			log, err := repo.Log(ctx, git.DefaultBranch, gitiles.LogLimit(1), gitiles.LogPath(file))
			if err != nil {
				return skerr.Wrapf(err, "Failed loading %s", file)
			}
			if len(log) != 1 {
				return skerr.Fmt("Failed to obtain the last commit which modified %s in %s; expected 1 commit but got %d", file, repo.URL, len(log))
			}
			metrics2.GetInt64Metric(METRIC_LAST_MODIFIED, map[string]string{
				"repo": repo.URL,
				"file": file,
			}).Update(int64(now.Sub(log[0].Timestamp).Seconds()))
		}
	}
	return nil
}

func StartLastModifiedMetrics(ctx context.Context, client *http.Client, filesByRepo map[string][]string) {
	reposToFiles := make(map[*gitiles.Repo][]string, len(filesByRepo))
	for repo, filePaths := range filesByRepo {
		r := gitiles.NewRepo(repo, client)
		reposToFiles[r] = filePaths
	}

	lv := metrics2.NewLiveness("last_successful_last_modified_metrics")
	go util.RepeatCtx(ctx, 5*time.Minute, func(ctx context.Context) {
		if err := updateLastModifiedMetrics(ctx, client, reposToFiles); err == nil {
			lv.Reset()
		} else {
			sklog.Errorf("Failed to update file last-modified metrics: %s", err)
		}
	})
}
