// Copyright © 2023 OpenIM. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package prome

import (
	"github.com/prometheus/client_golang/prometheus"
	"github.com/prometheus/client_golang/prometheus/promauto"
)

var (
	//auth rpc
	UserLoginCounter    prometheus.Counter
	UserRegisterCounter prometheus.Counter

	//seg
	SeqGetSuccessCounter prometheus.Counter
	SeqGetFailedCounter  prometheus.Counter
	SeqSetSuccessCounter prometheus.Counter
	SeqSetFailedCounter  prometheus.Counter

	//msg-db
	MsgInsertRedisSuccessCounter   prometheus.Counter
	MsgInsertRedisFailedCounter    prometheus.Counter
	MsgInsertMongoSuccessCounter   prometheus.Counter
	MsgInsertMongoFailedCounter    prometheus.Counter
	MsgPullFromRedisSuccessCounter prometheus.Counter
	MsgPullFromRedisFailedCounter  prometheus.Counter
	MsgPullFromMongoSuccessCounter prometheus.Counter
	MsgPullFromMongoFailedCounter  prometheus.Counter

	//msg-ws
	MsgRecvTotalCounter          prometheus.Counter
	GetNewestSeqTotalCounter     prometheus.Counter
	PullMsgBySeqListTotalCounter prometheus.Counter

	SingleChatMsgRecvSuccessCounter         prometheus.Counter
	GroupChatMsgRecvSuccessCounter          prometheus.Counter
	WorkSuperGroupChatMsgRecvSuccessCounter prometheus.Counter
	OnlineUserGauge                         prometheus.Gauge

	//msg-msg
	SingleChatMsgProcessSuccessCounter         prometheus.Counter
	SingleChatMsgProcessFailedCounter          prometheus.Counter
	GroupChatMsgProcessSuccessCounter          prometheus.Counter
	GroupChatMsgProcessFailedCounter           prometheus.Counter
	WorkSuperGroupChatMsgProcessSuccessCounter prometheus.Counter
	WorkSuperGroupChatMsgProcessFailedCounter  prometheus.Counter

	//msg-push
	MsgOnlinePushSuccessCounter  prometheus.Counter
	MsgOfflinePushSuccessCounter prometheus.Counter
	MsgOfflinePushFailedCounter  prometheus.Counter
	// api
	ApiRequestCounter        prometheus.Counter
	ApiRequestSuccessCounter prometheus.Counter
	ApiRequestFailedCounter  prometheus.Counter

	// grpc
	GrpcRequestCounter        prometheus.Counter
	GrpcRequestSuccessCounter prometheus.Counter
	GrpcRequestFailedCounter  prometheus.Counter

	SendMsgCounter prometheus.Counter

	// conversation
	ConversationCreateSuccessCounter prometheus.Counter
	ConversationCreateFailedCounter  prometheus.Counter
)

func NewUserLoginCounter() {
	if UserLoginCounter != nil {
		return
	}
	UserLoginCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "user_login",
		Help: "The number of user login",
	})
}
func NewUserRegisterCounter() {
	if UserRegisterCounter != nil {
		return
	}
	UserRegisterCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "user_register",
		Help: "The number of user register",
	})
}

func NewSeqGetSuccessCounter() {
	if SeqGetSuccessCounter != nil {
		return
	}
	SeqGetSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "seq_get_success",
		Help: "The number of successful get seq",
	})
}
func NewSeqGetFailedCounter() {
	if SeqGetFailedCounter != nil {
		return
	}
	SeqGetFailedCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "seq_get_failed",
		Help: "The number of failed get seq",
	})
}

func NewSeqSetSuccessCounter() {
	if SeqSetSuccessCounter != nil {
		return
	}
	SeqSetSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "seq_set_success",
		Help: "The number of successful set seq",
	})
}
func NewSeqSetFailedCounter() {
	if SeqSetFailedCounter != nil {
		return
	}
	SeqSetFailedCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "seq_set_failed",
		Help: "The number of failed set seq",
	})
}

func NewApiRequestCounter() {
	if ApiRequestCounter != nil {
		return
	}
	ApiRequestCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "api_request",
		Help: "The number of api request",
	})
}

func NewApiRequestSuccessCounter() {
	if ApiRequestSuccessCounter != nil {
		return
	}
	ApiRequestSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "api_request_success",
		Help: "The number of api request success",
	})
}

func NewApiRequestFailedCounter() {
	if ApiRequestFailedCounter != nil {
		return
	}
	ApiRequestFailedCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "api_request_failed",
		Help: "The number of api request failed",
	})
}

func NewGrpcRequestCounter() {
	if GrpcRequestCounter != nil {
		return
	}
	GrpcRequestCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "grpc_request",
		Help: "The number of api request",
	})
}

func NewGrpcRequestSuccessCounter() {
	if GrpcRequestSuccessCounter != nil {
		return
	}
	GrpcRequestSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "grpc_request_success",
		Help: "The number of grpc request success",
	})
}

func NewGrpcRequestFailedCounter() {
	if GrpcRequestFailedCounter != nil {
		return
	}
	GrpcRequestFailedCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "grpc_request_failed",
		Help: "The number of grpc request failed",
	})
}

func NewSendMsgCount() {
	if SendMsgCounter != nil {
		return
	}
	SendMsgCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "send_msg",
		Help: "The number of send msg",
	})
}

func NewMsgInsertRedisSuccessCounter() {
	if MsgInsertRedisSuccessCounter != nil {
		return
	}
	MsgInsertRedisSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "msg_insert_redis_success",
		Help: "The number of successful insert msg to redis",
	})
}

func NewMsgInsertRedisFailedCounter() {
	if MsgInsertRedisFailedCounter != nil {
		return
	}
	MsgInsertRedisFailedCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "msg_insert_redis_failed",
		Help: "The number of failed insert msg to redis",
	})
}

func NewMsgInsertMongoSuccessCounter() {
	if MsgInsertMongoSuccessCounter != nil {
		return
	}
	MsgInsertMongoSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "msg_insert_mongo_success",
		Help: "The number of successful insert msg to mongo",
	})
}

func NewMsgInsertMongoFailedCounter() {
	if MsgInsertMongoFailedCounter != nil {
		return
	}
	MsgInsertMongoFailedCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "msg_insert_mongo_failed",
		Help: "The number of failed insert msg to mongo",
	})
}

func NewMsgPullFromRedisSuccessCounter() {
	if MsgPullFromRedisSuccessCounter != nil {
		return
	}
	MsgPullFromRedisSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "msg_pull_from_redis_success",
		Help: "The number of successful pull msg from redis",
	})
}

func NewMsgPullFromRedisFailedCounter() {
	if MsgPullFromRedisFailedCounter != nil {
		return
	}
	MsgPullFromRedisFailedCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "msg_pull_from_redis_failed",
		Help: "The number of failed pull msg from redis",
	})
}

func NewMsgPullFromMongoSuccessCounter() {
	if MsgPullFromMongoSuccessCounter != nil {
		return
	}
	MsgPullFromMongoSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "msg_pull_from_mongo_success",
		Help: "The number of successful pull msg from mongo",
	})
}

func NewMsgPullFromMongoFailedCounter() {
	if MsgPullFromMongoFailedCounter != nil {
		return
	}
	MsgPullFromMongoFailedCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "msg_pull_from_mongo_failed",
		Help: "The number of failed pull msg from mongo",
	})
}

func NewMsgRecvTotalCounter() {
	if MsgRecvTotalCounter != nil {
		return
	}
	MsgRecvTotalCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "msg_recv_total",
		Help: "The number of msg received",
	})
}

func NewGetNewestSeqTotalCounter() {
	if GetNewestSeqTotalCounter != nil {
		return
	}
	GetNewestSeqTotalCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "get_newest_seq_total",
		Help: "the number of get newest seq",
	})
}
func NewPullMsgBySeqListTotalCounter() {
	if PullMsgBySeqListTotalCounter != nil {
		return
	}
	PullMsgBySeqListTotalCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "pull_msg_by_seq_list_total",
		Help: "The number of pull msg by seq list",
	})
}

func NewSingleChatMsgRecvSuccessCounter() {
	if SingleChatMsgRecvSuccessCounter != nil {
		return
	}
	SingleChatMsgRecvSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "single_chat_msg_recv_success",
		Help: "The number of single chat msg successful received ",
	})
}

func NewGroupChatMsgRecvSuccessCounter() {
	if GroupChatMsgRecvSuccessCounter != nil {
		return
	}
	GroupChatMsgRecvSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "group_chat_msg_recv_success",
		Help: "The number of group chat msg successful received",
	})
}

func NewWorkSuperGroupChatMsgRecvSuccessCounter() {
	if WorkSuperGroupChatMsgRecvSuccessCounter != nil {
		return
	}
	WorkSuperGroupChatMsgRecvSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "work_super_group_chat_msg_recv_success",
		Help: "The number of work/super group chat msg successful received",
	})
}

func NewOnlineUserGauges() {
	if OnlineUserGauge != nil {
		return
	}
	OnlineUserGauge = promauto.NewGauge(prometheus.GaugeOpts{
		Name: "online_user_num",
		Help: "The number of online user num",
	})
}

func NewSingleChatMsgProcessSuccessCounter() {
	if SingleChatMsgProcessSuccessCounter != nil {
		return
	}
	SingleChatMsgProcessSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "single_chat_msg_process_success",
		Help: "The number of single chat msg successful processed",
	})
}

func NewSingleChatMsgProcessFailedCounter() {
	if SingleChatMsgProcessFailedCounter != nil {
		return
	}
	SingleChatMsgProcessFailedCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "single_chat_msg_process_failed",
		Help: "The number of single chat msg failed processed",
	})
}

func NewGroupChatMsgProcessSuccessCounter() {
	if GroupChatMsgProcessSuccessCounter != nil {
		return
	}
	GroupChatMsgProcessSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "group_chat_msg_process_success",
		Help: "The number of group chat msg successful processed",
	})
}

func NewGroupChatMsgProcessFailedCounter() {
	if GroupChatMsgProcessFailedCounter != nil {
		return
	}
	GroupChatMsgProcessFailedCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "group_chat_msg_process_failed",
		Help: "The number of group chat msg failed processed",
	})
}

func NewWorkSuperGroupChatMsgProcessSuccessCounter() {
	if WorkSuperGroupChatMsgProcessSuccessCounter != nil {
		return
	}
	WorkSuperGroupChatMsgProcessSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "work_super_group_chat_msg_process_success",
		Help: "The number of work/super group chat msg successful processed",
	})
}
func NewWorkSuperGroupChatMsgProcessFailedCounter() {
	if WorkSuperGroupChatMsgProcessFailedCounter != nil {
		return
	}
	WorkSuperGroupChatMsgProcessFailedCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "work_super_group_chat_msg_process_failed",
		Help: "The number of work/super group chat msg failed processed",
	})
}

func NewMsgOnlinePushSuccessCounter() {
	if MsgOnlinePushSuccessCounter != nil {
		return
	}
	MsgOnlinePushSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "msg_online_push_success",
		Help: "The number of msg successful online pushed",
	})
}

func NewMsgOfflinePushSuccessCounter() {
	if MsgOfflinePushSuccessCounter != nil {
		return
	}
	MsgOfflinePushSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "msg_offline_push_success",
		Help: "The number of msg successful offline pushed",
	})
}
func NewMsgOfflinePushFailedCounter() {
	if MsgOfflinePushFailedCounter != nil {
		return
	}
	MsgOfflinePushFailedCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "msg_offline_push_failed",
		Help: "The number of msg failed offline pushed",
	})
}

func NewConversationCreateSuccessCounter() {
	if ConversationCreateSuccessCounter != nil {
		return
	}
	ConversationCreateSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "conversation_push_success",
		Help: "The number of conversation successful pushed",
	})
}

func NewConversationCreateFailedCounter() {
	if ConversationCreateFailedCounter != nil {
		return
	}
	ConversationCreateFailedCounter = promauto.NewCounter(prometheus.CounterOpts{
		Name: "conversation_push_failed",
		Help: "The number of conversation failed pushed",
	})
}