package api

import (
	"context"
)

type Query interface {
	List(ctx context.Context, param *ListParam) ([]*Model, error)
	Plans(ctx context.Context, param *PlansParam) ([]*Model, error)
	Detail(ctx context.Context, param *DetailParam) (*Model, error)
}

type ListParam struct {
	Provider      string
	Region        string
	OrgID         uint64
	ProjectID     uint64
	ClusterID     string
	SharedTier    bool
	StorageBucket string
	StoragePrefix string
	StartUnixSec  int64
	EndUnixSec    int64
	Fields        []string
	Schemas       []string
	StmtTypes     []string
	Text          string
}

type PlansParam struct {
	Provider      string
	Region        string
	OrgID         uint64
	ProjectID     uint64
	ClusterID     string
	SharedTier    bool
	StorageBucket string
	StoragePrefix string
	StartUnixSec  int64
	EndUnixSec    int64
	Digest        string
	SchemaName    string
}

type DetailParam struct {
	Provider      string
	Region        string
	OrgID         uint64
	ProjectID     uint64
	ClusterID     string
	SharedTier    bool
	StorageBucket string
	StoragePrefix string
	StartUnixSec  int64
	EndUnixSec    int64
	Digest        string
	Plans         []string
	SchemaName    string
}

type Model struct {
	BeginTime                    int     `json:"summary_begin_time"`
	EndTime                      int     `json:"summary_end_time"`
	DigestText                   string  `json:"digest_text"`
	Digest                       string  `json:"digest"`
	ExecCount                    int     `json:"exec_count"`
	StmtType                     string  `json:"stmt_type"`
	SumErrors                    int     `json:"sum_errors"`
	SumWarnings                  int     `json:"sum_warnings"`
	SumLatency                   int     `json:"sum_latency"`
	MaxLatency                   int     `json:"max_latency"`
	MinLatency                   int     `json:"min_latency"`
	AvgLatency                   int     `json:"avg_latency"`
	AvgParseLatency              int     `json:"avg_parse_latency"`
	MaxParseLatency              int     `json:"max_parse_latency"`
	AvgCompileLatency            int     `json:"avg_compile_latency"`
	MaxCompileLatency            int     `json:"max_compile_latency"`
	SumCopTaskNum                int     `json:"sum_cop_task_num"`
	MaxCopProcessTime            int     `json:"max_cop_process_time"`
	MaxCopWaitTime               int     `json:"max_cop_wait_time"`
	AvgProcessTime               int     `json:"avg_process_time"`
	MaxProcessTime               int     `json:"max_process_time"`
	AvgWaitTime                  int     `json:"avg_wait_time"`
	MaxWaitTime                  int     `json:"max_wait_time"`
	AvgBackoffTime               int     `json:"avg_backoff_time"`
	MaxBackoffTime               int     `json:"max_backoff_time"`
	AvgTotalKeys                 int     `json:"avg_total_keys"`
	MaxTotalKeys                 int     `json:"max_total_keys"`
	AvgProcessedKeys             int     `json:"avg_processed_keys"`
	MaxProcessedKeys             int     `json:"max_processed_keys"`
	AvgPrewriteTime              int     `json:"avg_prewrite_time"`
	MaxPrewriteTime              int     `json:"max_prewrite_time"`
	AvgCommitTime                int     `json:"avg_commit_time"`
	MaxCommitTime                int     `json:"max_commit_time"`
	AvgGetCommitTsTime           int     `json:"avg_get_commit_ts_time"`
	MaxGetCommitTsTime           int     `json:"max_get_commit_ts_time"`
	AvgCommitBackoffTime         int     `json:"avg_commit_backoff_time"`
	MaxCommitBackoffTime         int     `json:"max_commit_backoff_time"`
	AvgResolveLockTime           int     `json:"avg_resolve_lock_time"`
	MaxResolveLockTime           int     `json:"max_resolve_lock_time"`
	AvgLocalLatchWaitTime        int     `json:"avg_local_latch_wait_time"`
	MaxLocalLatchWaitTime        int     `json:"max_local_latch_wait_time"`
	AvgWriteKeys                 int     `json:"avg_write_keys"`
	MaxWriteKeys                 int     `json:"max_write_keys"`
	AvgWriteSize                 int     `json:"avg_write_size"`
	MaxWriteSize                 int     `json:"max_write_size"`
	AvgPrewriteRegions           int     `json:"avg_prewrite_regions"`
	MaxPrewriteRegions           int     `json:"max_prewrite_regions"`
	AvgTxnRetry                  int     `json:"avg_txn_retry"`
	MaxTxnRetry                  int     `json:"max_txn_retry"`
	SumBackoffTimes              int     `json:"sum_backoff_times"`
	AvgMem                       int     `json:"avg_mem"`
	MaxMem                       int     `json:"max_mem"`
	AvgDisk                      int     `json:"avg_disk"`
	MaxDisk                      int     `json:"max_disk"`
	AvgAffectedRows              int     `json:"avg_affected_rows"`
	FirstSeen                    int     `json:"first_seen"`
	LastSeen                     int     `json:"last_seen"`
	SampleUser                   string  `json:"sample_user"`
	QuerySampleText              string  `json:"query_sample_text"`
	PrevSampleText               string  `json:"prev_sample_text"`
	SchemaName                   string  `json:"schema_name"`
	TableNames                   string  `json:"table_names"`
	IndexNames                   string  `json:"index_names"`
	PlanCount                    int     `json:"plan_count"`
	Plan                         string  `json:"plan"`
	PlanDigest                   string  `json:"plan_digest"`
	BinaryPlan                   string  `json:"binary_plan"`
	BinaryPlanText               string  `json:"binary_plan_text"`
	PlanHint                     string  `json:"plan_hint"`
	PlanInCache                  bool    `json:"plan_in_cache"`
	PlanCacheHits                int64   `json:"plan_cache_hits"`
	PlanInBinding                bool    `json:"plan_in_binding"`
	MaxRocksdbDeleteSkippedCount uint    `json:"max_rocksdb_delete_skipped_count"`
	AvgRocksdbDeleteSkippedCount uint    `json:"avg_rocksdb_delete_skipped_count"`
	MaxRocksdbKeySkippedCount    uint    `json:"max_rocksdb_key_skipped_count"`
	AvgRocksdbKeySkippedCount    uint    `json:"avg_rocksdb_key_skipped_count"`
	MaxRocksdbBlockCacheHitCount uint    `json:"max_rocksdb_block_cache_hit_count"`
	AvgRocksdbBlockCacheHitCount uint    `json:"avg_rocksdb_block_cache_hit_count"`
	MaxRocksdbBlockReadCount     uint    `json:"max_rocksdb_block_read_count"`
	AvgRocksdbBlockReadCount     uint    `json:"avg_rocksdb_block_read_count"`
	MaxRocksdbBlockReadByte      uint    `json:"max_rocksdb_block_read_byte"`
	AvgRocksdbBlockReadByte      uint    `json:"avg_rocksdb_block_read_byte"`
	SumRu                        float64 `json:"sum_ru"`
	SumRru                       float64 `json:"sum_rru"`
	SumWru                       float64 `json:"sum_wru"`
	SumRUWaitDuration            int64   `json:"sum_ru_wait_duration"`
	AvgRu                        float64 `json:"avg_ru"`
	AvgRru                       float64 `json:"avg_rru"`
	AvgWru                       float64 `json:"avg_wru"`
	MaxRRU                       float64 `json:"max_rru"`
	MaxWRU                       float64 `json:"max_wru"`
	MaxRUWaitDuration            int64   `json:"max_ru_wait_duration"`

	// RUv2 metrics
	SumRuv2 float64 `json:"sum_ru_v2"`
	MaxRuv2 float64 `json:"max_ru_v2"`
	AvgRuv2 float64 `json:"avg_ru_v2"`

	// IA remote read segment metrics
	SumIaReadSegmentCount          int64   `json:"sum_ia_read_segment_count"`
	SumIaRemoteReadSegmentSize     int64   `json:"sum_ia_remote_read_segment_size"`
	SumIaRemoteReadSegmentWaitTime float64 `json:"sum_ia_remote_read_segment_wait_time"`
	AvgIaReadSegmentCount          float64 `json:"avg_ia_read_segment_count"`
	AvgIaRemoteReadSegmentSize     float64 `json:"avg_ia_remote_read_segment_size"`
	AvgIaRemoteReadSegmentWaitTime float64 `json:"avg_ia_remote_read_segment_wait_time"`
	MaxIaReadSegmentCount          int64   `json:"max_ia_read_segment_count"`
	MaxIaRemoteReadSegmentSize     int64   `json:"max_ia_remote_read_segment_size"`
	MaxIaRemoteReadSegmentWaitTime float64 `json:"max_ia_remote_read_segment_wait_time"`
}
