// SPDX-License-Identifier: GPL-3.0-or-later

package couchdb

// https://docs.couchdb.org/en/stable/api/index.html

type cdbMetrics struct {
	// https://docs.couchdb.org/en/stable/api/server/common.html#active-tasks
	ActiveTasks []cdbActiveTask
	// https://docs.couchdb.org/en/stable/api/server/common.html#node-node-name-stats
	NodeStats *cdbNodeStats
	// https://docs.couchdb.org/en/stable/api/server/common.html#node-node-name-system
	NodeSystem *cdbNodeSystem
	// https://docs.couchdb.org/en/stable/api/database/common.html
	DBStats []cdbDBStats
}

func (m cdbMetrics) empty() bool {
	switch {
	case m.hasActiveTasks(), m.hasNodeStats(), m.hasNodeSystem(), m.hasDBStats():
		return false
	}
	return true
}

func (m cdbMetrics) hasActiveTasks() bool { return m.ActiveTasks != nil }
func (m cdbMetrics) hasNodeStats() bool   { return m.NodeStats != nil }
func (m cdbMetrics) hasNodeSystem() bool  { return m.NodeSystem != nil }
func (m cdbMetrics) hasDBStats() bool     { return m.DBStats != nil }

type cdbActiveTask struct {
	Type string `json:"type"`
}

type cdbNodeStats struct {
	CouchDB struct {
		DatabaseReads struct {
			Value float64 `stm:"" json:"value"`
		} `stm:"database_reads" json:"database_reads"`
		DatabaseWrites struct {
			Value float64 `stm:"" json:"value"`
		} `stm:"database_writes" json:"database_writes"`
		HTTPd struct {
			ViewReads struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"view_reads" json:"view_reads"`
		} `stm:"httpd" json:"httpd"`
		HTTPdRequestMethods struct {
			Copy struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"COPY" json:"COPY"`
			Delete struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"DELETE" json:"DELETE"`
			Get struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"GET" json:"GET"`
			Head struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"HEAD" json:"HEAD"`
			Options struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"OPTIONS" json:"OPTIONS"`
			Post struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"POST" json:"POST"`
			Put struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"PUT" json:"PUT"`
		} `stm:"httpd_request_methods" json:"httpd_request_methods"`
		HTTPdStatusCodes struct {
			Code200 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"200" json:"200"`
			Code201 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"201" json:"201"`
			Code202 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"202" json:"202"`
			Code204 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"204" json:"204"`
			Code206 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"206" json:"206"`
			Code301 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"301" json:"301"`
			Code302 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"302" json:"302"`
			Code304 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"304" json:"304"`
			Code400 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"400" json:"400"`
			Code401 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"401" json:"401"`
			Code403 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"403" json:"403"`
			Code404 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"404" json:"404"`
			Code405 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"405" json:"405"`
			Code406 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"406" json:"406"`
			Code409 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"409" json:"409"`
			Code412 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"412" json:"412"`
			Code413 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"413" json:"413"`
			Code414 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"414" json:"414"`
			Code415 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"415" json:"415"`
			Code416 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"416" json:"416"`
			Code417 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"417" json:"417"`
			Code500 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"500" json:"500"`
			Code501 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"501" json:"501"`
			Code503 struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"503" json:"503"`
		} `stm:"httpd_status_codes" json:"httpd_status_codes"`
		OpenOSFiles struct {
			Value float64 `stm:"" json:"value"`
		} `stm:"open_os_files" json:"open_os_files"`
	} `stm:"couchdb"  json:"couchdb"`
	CouchReplicator struct {
		Jobs struct {
			Running struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"running" json:"running"`
			Pending struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"pending" json:"pending"`
			Crashed struct {
				Value float64 `stm:"" json:"value"`
			} `stm:"crashed" json:"crashed"`
		} `stm:"jobs" json:"jobs"`
	} `stm:"couch_replicator" json:"couch_replicator"`
}

type cdbNodeSystem struct {
	Memory struct {
		Other     float64 `stm:"other" json:"other"`
		Atom      float64 `stm:"atom" json:"atom"`
		AtomUsed  float64 `stm:"atom_used" json:"atom_used"`
		Processes float64 `stm:"processes" json:"processes"`
		Binary    float64 `stm:"binary" json:"binary"`
		Code      float64 `stm:"code" json:"code"`
		Ets       float64 `stm:"ets" json:"ets"`
	} `stm:"memory" json:"memory"`

	RunQueue                float64 `stm:"run_queue" json:"run_queue"`
	EtsTableCount           float64 `stm:"ets_table_count" json:"ets_table_count"`
	ContextSwitches         float64 `stm:"context_switches" json:"context_switches"`
	Reductions              float64 `stm:"reductions" json:"reductions"`
	IOInput                 float64 `stm:"io_input" json:"io_input"`
	IOOutput                float64 `stm:"io_output" json:"io_output"`
	OSProcCount             float64 `stm:"os_proc_count" json:"os_proc_count"`
	ProcessCount            float64 `stm:"process_count" json:"process_count"`
	InternalReplicationJobs float64 `stm:"internal_replication_jobs" json:"internal_replication_jobs"`

	MessageQueues map[string]interface{} `json:"message_queues"`
}

type cdbDBStats struct {
	Key   string
	Error string
	Info  struct {
		Sizes struct {
			File     float64 `stm:"file" json:"file"`
			External float64 `stm:"external" json:"external"`
			Active   float64 `stm:"active" json:"active"`
		} `stm:"db_sizes" json:"sizes"`
		DocDelCount float64 `stm:"db_doc_del_counts" json:"doc_del_count"`
		DocCount    float64 `stm:"db_doc_counts" json:"doc_count"`
	}
}
