package main

import (
	"context"
	"encoding/json"
	"fmt"
	"net/http"
	"net/url"
	"strings"
	"time"

	"go.skia.org/infra/go/httputils"
	"go.skia.org/infra/go/metrics2"
	"go.skia.org/infra/go/sklog"
	"go.skia.org/infra/go/util"
	"golang.org/x/oauth2"
)

const (
	firestoreBackupOperationType = "type.googleapis.com/google.firestore.admin.v1beta1.ExportDocumentsMetadata"
	firestoreBackupUriPrefix     = "gs://skia-firestore-backup/everything/"
)

// firestoreOperations decodes the JSON response from a Firestore list operations request.
type firestoreOperations struct {
	Operations    []firestoreOperation `json:"operations"`
	NextPageToken string               `json:"nextPageToken"`
}

// firestoreOperation partially decodes a single Firestore operation from JSON.
type firestoreOperation struct {
	Name     string                     `json:"name"`
	Metadata firestoreOperationMetadata `json:"metadata"`
	Done     bool                       `json:"done"`
	// other fields omitted
}

// firestoreOperationMetadata is a sub-struct of firestoreOperation.
type firestoreOperationMetadata struct {
	Type            string `json:"@type"`
	EndTime         string `json:"endTime"`
	OperationState  string `json:"operationState"`
	OutputUriPrefix string `json:"outputUriPrefix"`
	// other fields omitted
}

// Returns the most recent time that a Firestore ExportDocumentsMetadata operation exporting to
// firestoreBackupUriPrefix completed successfully.
func getFirestoreLastBackupCompleted(ctx context.Context, httpClient *http.Client) (time.Time, error) {
	z := time.Time{}
	latest := time.Time{}
	nextPageToken := ""
	for {
		listUrl := fmt.Sprintf("https://firestore.googleapis.com/v1/projects/skia-firestore/databases/*/operations?filter=%s", url.QueryEscape("metadata.operationState=SUCCESSFUL"))
		if nextPageToken != "" {
			listUrl = listUrl + "&pageToken=" + nextPageToken
		}
		sklog.Debugf("Sending Firestore list operations request: %q", listUrl)
		resp, err := httpClient.Get(listUrl)
		if err != nil {
			return z, fmt.Errorf("Error performing Firestore list operations request: %s", err)
		}
		operations := firestoreOperations{}
		if err := json.NewDecoder(resp.Body).Decode(&operations); err != nil {
			return z, fmt.Errorf("Unable to decode Firestore list operations response as JSON: %s", err)
		}
		sklog.Debugf("Decoded Firestore list operations response: %+v", operations)
		for _, o := range operations.Operations {
			if o.Done &&
				o.Metadata.Type == firestoreBackupOperationType &&
				o.Metadata.OperationState == "SUCCESSFUL" &&
				strings.HasPrefix(o.Metadata.OutputUriPrefix, firestoreBackupUriPrefix) {
				if parsed, err := time.Parse(time.RFC3339Nano, o.Metadata.EndTime); err != nil {
					return z, fmt.Errorf("Invalid time %q in Firestore list operations response for %q: %s", o.Metadata.EndTime, o.Name, err)
				} else if parsed.After(latest) {
					latest = parsed
				}
			}
		}
		if operations.NextPageToken == "" {
			break
		} else {
			nextPageToken = operations.NextPageToken
		}
	}
	if util.TimeIsZero(latest) {
		return z, fmt.Errorf("Firestore list operations response contained no matching results.")
	}
	return latest, nil
}

// StartFirestoreBackupMetrics starts a goroutine to periodically update the
// last_successful_firestore_backup liveness metric.
func StartFirestoreBackupMetrics(ctx context.Context, tokenSource oauth2.TokenSource) error {
	httpClient := httputils.DefaultClientConfig().WithTokenSource(tokenSource).With2xxOnly().Client()
	lvMetrics := metrics2.NewLiveness("last_successful_firestore_backup_metrics_update")
	lvBackup := metrics2.NewLiveness("last_successful_firestore_backup")
	go util.RepeatCtx(5*time.Minute, ctx, func(ctx context.Context) {
		if lastBackupTime, err := getFirestoreLastBackupCompleted(ctx, httpClient); err != nil {
			sklog.Errorf("Failed to update firestore backup metrics: %s", err)
		} else {
			lvBackup.ManualReset(lastBackupTime)
			lvMetrics.Reset()
		}
	})
	return nil
}
