package controller

import (
	"github.com/gin-gonic/gin"
	"github.com/mhaya/game/game_cluster/internal/code"
	"github.com/mhaya/game/game_cluster/nodes/webadmin/common"
	"github.com/mhaya/game/game_cluster/nodes/webadmin/entity"
	"github.com/mhaya/game/game_cluster/nodes/webadmin/service"
)

type Synthesis struct {
	nodeId string
	sev    *service.Synthesis
}

func NewSynthesis(nodeId string) *Synthesis {
	return &Synthesis{
		nodeId: nodeId,
		sev:    service.NewSynthesis(nodeId),
	}
}

// 统计用户相关信息
func (s *Synthesis) UserList(ctx *gin.Context) {
	var req entity.UserListReq
	if err := ctx.ShouldBindJSON(&req); err != nil {
		common.PackOkResult(ctx, code.ParamError)
		return
	}

	resp, err := s.sev.UserList(req)
	if err != nil {
		common.PackOkResult(ctx, err.Code)
		return
	}

	common.PackOkResult(ctx, code.OK, resp)
}

// FindUserLogDaily 查询用户日活跃
func (s *Synthesis) FindUserLogDaily(ctx *gin.Context) {
	var req entity.UserLogDailyReq
	if err := ctx.ShouldBindJSON(&req); err != nil {
		common.PackOkResult(ctx, code.ParamError)
		return
	}

	resp, err := s.sev.FindMDBUserLogDaily(req)
	if err != nil {
		common.PackOkResult(ctx, err.Code)
		return
	}

	common.PackOkResult(ctx, code.OK, resp)
}

// FindUserRetention 查询用户留存
func (s *Synthesis) FindUserRetention(ctx *gin.Context) {
	var req entity.UserRetentionReq
	if err := ctx.ShouldBindJSON(&req); err != nil {
		common.PackOkResult(ctx, code.ParamError)
		return
	}

	resp, err := s.sev.FindUserRetention(req)
	if err != nil {
		common.PackOkResult(ctx, err.Code)
		return
	}

	common.PackOkResult(ctx, code.OK, resp)
}

// FindUserCountryCount 查询用户国家分布
func (s *Synthesis) FindUserCountryCount(ctx *gin.Context) {
	resp, err := s.sev.FindUserCountryCount()
	if err != nil {
		common.PackOkResult(ctx, err.Code)
		return
	}

	common.PackOkResult(ctx, code.OK, resp)
}

// FindWithdrawal 查询提现记录
func (s *Synthesis) FindWithdrawal(ctx *gin.Context) {
	var req entity.UserWithdrawalReq
	if err := ctx.ShouldBindJSON(&req); err != nil {
		common.PackOkResult(ctx, code.ParamError)
		return
	}

	resp, err := s.sev.FindWithdrawal(req)
	if err != nil {
		common.PackOkResult(ctx, err.Code)
		return
	}

	common.PackOkResult(ctx, code.OK, resp)
}

// 导出提现记录
func (s *Synthesis) WithdrawalExport(ctx *gin.Context) {
	var req entity.UserWithdrawalExportReq
	if err := ctx.ShouldBindJSON(&req); err != nil {
		common.PackOkResult(ctx, code.ParamError)
		return
	}

	resp, err := s.sev.WithdrawalExport(req)
	if err != nil {
		common.PackOkResult(ctx, err.Code)
		return
	}

	common.PackOkResult(ctx, code.OK, resp)
}

// WithdrawalStatus 修改提现状态
func (s *Synthesis) WithdrawalStatus(ctx *gin.Context) {
	var req entity.UserWithdrawalStatus
	if err := ctx.ShouldBindJSON(&req); err != nil {
		common.PackOkResult(ctx, code.ParamError)
		return
	}

	err := s.sev.WithdrawalStatus(req)
	if err != nil {
		common.PackOkResult(ctx, err.Code)
		return
	}

	common.PackOkResult(ctx, code.OK, nil)
}

// WithdrawalStatusBatch 修改提现状态批量
func (s *Synthesis) WithdrawalStatusBatch(ctx *gin.Context) {
	var req entity.UserWithdrawalStatusBatch
	if err := ctx.ShouldBindJSON(&req); err != nil {
		common.PackOkResult(ctx, code.ParamError)
		return
	}

	err := s.sev.WithdrawalStatusBatch(req)
	if err != nil {
		common.PackOkResult(ctx, err.Code)
		return
	}

	common.PackOkResult(ctx, code.OK, nil)
}

// FindUserLevel 用户等级统计
func (s *Synthesis) FindUserLevel(ctx *gin.Context) {
	resp, err := s.sev.FindUserLevel()
	if err != nil {
		common.PackOkResult(ctx, err.Code)
		return
	}

	common.PackOkResult(ctx, code.OK, resp)
}

// 综合统计
func (s *Synthesis) Overview(ctx *gin.Context) {
	var req entity.OverviewReq
	if err := ctx.ShouldBindJSON(&req); err != nil {
		common.PackOkResult(ctx, code.ParamError)
		return
	}

	resp, err := s.sev.Overview(req)
	if err != nil {
		common.PackOkResult(ctx, err.Code)
		return
	}

	common.PackOkResult(ctx, code.OK, resp)
}

// 活动统计
func (s *Synthesis) Activity(ctx *gin.Context) {
	// TODO Activity 目前没有活动模块
}

// 转盘统计
func (s *Synthesis) Turntable(ctx *gin.Context) {
	var req entity.TurntableReq
	if err := ctx.ShouldBindJSON(&req); err != nil {
		common.PackOkResult(ctx, code.ParamError)
		return
	}

	resp, err := s.sev.Turntable(req)
	if err != nil {
		common.PackOkResult(ctx, err.Code)
		return
	}

	common.PackOkResult(ctx, code.OK, resp)
}

// 资产统计
func (s *Synthesis) Assets(ctx *gin.Context) {
	var req entity.AssetsReq
	if err := ctx.ShouldBindJSON(&req); err != nil {
		common.PackOkResult(ctx, code.ParamError)
		return
	}

	resp, err := s.sev.Assets(req)
	if err != nil {
		common.PackOkResult(ctx, err.Code)
		return
	}

	common.PackOkResult(ctx, code.OK, resp)
}

// 资产变动记录
func (s *Synthesis) AssetsRecord(ctx *gin.Context) {
	var req entity.AssetsRecordReq
	if err := ctx.ShouldBindJSON(&req); err != nil {
		common.PackOkResult(ctx, code.ParamError)
		return
	}

	resp, err := s.sev.AssetsRecord(req)
	if err != nil {
		common.PackOkResult(ctx, err.Code)
		return
	}

	common.PackOkResult(ctx, code.OK, resp)
}

// 邀请统计
func (s *Synthesis) Invite(ctx *gin.Context) {
	var req entity.InviteReq
	if err := ctx.ShouldBindJSON(&req); err != nil {
		common.PackOkResult(ctx, code.ParamError)
		return
	}

	resp, err := s.sev.Invite(req)
	if err != nil {
		common.PackOkResult(ctx, err.Code)
		return
	}

	common.PackOkResult(ctx, code.OK, resp)
}

// 活跃统计
func (s *Synthesis) Active(ctx *gin.Context) {
	var req entity.ActiveReq
	if err := ctx.ShouldBindJSON(&req); err != nil {
		common.PackOkResult(ctx, code.ParamError)
		return
	}

	resp, err := s.sev.Active(req)
	if err != nil {
		common.PackOkResult(ctx, err.Code)
		return
	}

	common.PackOkResult(ctx, code.OK, resp)
}

// 后台操作记录
func (s *Synthesis) Records(ctx *gin.Context) {
	var req entity.RecordListReq
	if err := ctx.ShouldBindJSON(&req); err != nil {
		common.PackOkResult(ctx, code.ParamError)
		return
	}

	resp, err := s.sev.RecordList(req)
	if err != nil {
		common.PackOkResult(ctx, err.Code)
		return
	}

	common.PackOkResult(ctx, code.OK, resp)
}

// 用户行为检测
func (s *Synthesis) BehaviorMonitoring(ctx *gin.Context) {
	var req entity.BehaviorMonitoringReq
	if err := ctx.ShouldBindJSON(&req); err != nil {
		common.PackOkResult(ctx, code.ParamError)
		return
	}

	resp, err := s.sev.BehaviorMonitoring(req)
	if err != nil {
		common.PackOkResult(ctx, err.Code)
		return
	}

	common.PackOkResult(ctx, code.OK, resp)
}

// 任务完成度统计
func (s *Synthesis) TaskCompletion(ctx *gin.Context) {
	var req entity.TaskCompletionReq
	if err := ctx.ShouldBindJSON(&req); err != nil {
		common.PackOkResult(ctx, code.ParamError)
		return
	}

	resp, err := s.sev.TaskCompletion(req)
	if err != nil {
		common.PackOkResult(ctx, err.Code)
		return
	}

	common.PackOkResult(ctx, code.OK, resp)
}
