package cmd

import (
	"strconv"
	"time"
)

type diagnoseQueryPlanBuilder struct {
	next int
}

func newDiagnoseQueryPlanBuilder() *diagnoseQueryPlanBuilder {
	return &diagnoseQueryPlanBuilder{next: 1}
}

func (b *diagnoseQueryPlanBuilder) newLokiSeedRecord(query string, start, end time.Time, limit int) DiagnoseQueryRecord {
	id := b.nextQueryID()
	return DiagnoseQueryRecord{
		ID:        id,
		Type:      "loki",
		Purpose:   "seed_exact_match",
		Query:     query,
		StartUTC:  formatDiagnoseBundleTimeUTC(start),
		EndUTC:    formatDiagnoseBundleTimeUTC(end),
		Limit:     limit,
		Direction: "backward",
		Status:    "pending",
	}
}

func (b *diagnoseQueryPlanBuilder) newClinicAPIRecord(purpose, query string, start, end time.Time, limit int) DiagnoseQueryRecord {
	return DiagnoseQueryRecord{
		ID:       b.nextQueryID(),
		Type:     "clinic_api",
		Purpose:  purpose,
		Query:    query,
		StartUTC: formatDiagnoseBundleTimeUTC(start),
		EndUTC:   formatDiagnoseBundleTimeUTC(end),
		Limit:    limit,
		Status:   "pending",
	}
}

func (b *diagnoseQueryPlanBuilder) newLokiRelatedRecord(purpose, query string, start, end time.Time, limit int) DiagnoseQueryRecord {
	return DiagnoseQueryRecord{
		ID:        b.nextQueryID(),
		Type:      "loki",
		Purpose:   purpose,
		Query:     query,
		StartUTC:  formatDiagnoseBundleTimeUTC(start),
		EndUTC:    formatDiagnoseBundleTimeUTC(end),
		Limit:     limit,
		Direction: "backward",
		Status:    "pending",
	}
}

func (b *diagnoseQueryPlanBuilder) nextQueryID() string {
	if b.next == 0 {
		b.next = 1
	}
	id := "q" + strconv.Itoa(b.next)
	b.next++
	return id
}

func completeDiagnoseQueryRecord(record *DiagnoseQueryRecord, started time.Time, resultCount int, err error) {
	record.DurationMS = time.Since(started).Milliseconds()
	record.ResultCount = resultCount
	record.HitLimit = record.Limit > 0 && resultCount == record.Limit
	if err != nil {
		record.Status = "failed"
		return
	}
	record.Status = "success"
}
