package push

import (
	"fmt"
	"gitlab.fjmaimaimai.com/mmm-go/gocomm/pkg/log"
	protocol "openapi/pkg/domain"
	"openapi/pkg/infrastructure/push"
	"openapi/pkg/infrastructure/push/getui"
	"openapi/pkg/infrastructure/repository"
	"openapi/pkg/infrastructure/utils"
	"strings"
)

//推送信息
func Notification(header *protocol.RequestHeader, request *protocol.PushInfoRequest) (rsp *protocol.PushInfoResponse, err error) {
	var (
		repApp, _       = repository.NewAppInfoRepository(nil)
		repDevice, _    = repository.NewPushDeviceRepository(nil)
		appInfo         *protocol.AppInfo
		receivers       []string
		deviceList      []*protocol.Device
		requestOriginal *protocol.PushInfoOriginalRequest = &protocol.PushInfoOriginalRequest{
			Type:    request.Type,
			Title:   request.Title,
			Content: request.Content,
			Ext:     request.Ext,
		}
	)
	rsp = &protocol.PushInfoResponse{}
	if appInfo, err = repApp.FindOne(map[string]interface{}{"project_key": request.ProjectKey}); err != nil {
		log.Error(err)
		err = protocol.NewCustomMessage(1, fmt.Sprintf("project_key:%v not found", request.ProjectKey))
		return
	}
	if deviceList, err = repDevice.Find(map[string]interface{}{"receivers": request.Receivers}); err != nil {
		log.Error(err)
		err = nil
		return
	}
	if len(deviceList) == 0 {
		err = protocol.NewSuccessWithMessage(fmt.Sprintf("接收人:%v 未查询到注册的设备信息!", request.Receivers))
		return
	}
	for i := range deviceList {
		receivers = append(receivers, deviceList[i].ClientId)
	}
	requestOriginal.AppKey = appInfo.AppKey
	requestOriginal.AppId = appInfo.AppId
	requestOriginal.Secret = appInfo.AppMasterSecret
	requestOriginal.ClientIdList = receivers
	return NotificationOriginal(header, requestOriginal)
}

func NotificationOriginal(header *protocol.RequestHeader, request *protocol.PushInfoOriginalRequest) (rsp *protocol.PushInfoResponse, err error) {
	var (
		sendData  = make(map[string]interface{})
		clientIds []string
		options   []push.Option = []push.Option{
			push.DebugModule(true),
			push.AppId(request.AppId),
			push.AppKey(request.AppKey),
			push.AppMasterSecret(request.Secret),
			push.MsgType(request.Type),

			push.Title(request.Title),
			push.Content(request.Content),
			//push.TransmissionContent(utils.JsonAssertString(request.Ext)),
		}
	)

	if v, ok := request.Ext["transData"]; ok {
		options = append(options, push.TransmissionContent(utils.JsonAssertString(v)))
	}
	clientIds = request.ClientIdList
	switch len(clientIds) {
	case 0:
		err = protocol.NewCustomMessage(2, "clientId/deviceToken 不能同时为空.")
		return
	case 1:
		options = append(options,
			push.PushType(push.PushToSingle),
			push.ClientId(clientIds[0]),
		)
		break
	default:
		options = append(options,
			push.PushType(push.PushToList),
			push.ClientIds(clientIds),
		)
		break
	}

	var pushService push.INotification = &getui.GetuiNotification{}
	err = pushService.Init(options...)
	if err != nil {
		log.Error(err)
		return
	}
	if err = pushService.Send(sendData); err != nil {
		log.Error(err)
		return
	}
	rsp = &protocol.PushInfoResponse{}
	return
}

//更新设备信息
func UpdateDevice(header *protocol.RequestHeader, request *protocol.UpdateDeviceRequest) (rsp *protocol.UpdateDeviceResponse, err error) {
	var (
		device *protocol.Device
	)
	rsp = &protocol.UpdateDeviceResponse{}
	rep, _ := repository.NewPushDeviceRepository(nil)
	if device, err = rep.FindOne(map[string]interface{}{"uid": request.Muid}); err != nil {
		if err == protocol.ERR_DB_NOT_FOUND {
			err = nil
			rep.Save(request)
			return
		}
		log.Error(err)
		return
	}
	if device.ClientId == strings.TrimSpace(request.ClientId) && device.DeviceToken == strings.TrimSpace(request.DeviceToken) {
		err = protocol.NewSuccessWithMessage("更新成功")
		return
	}
	if err = rep.UpdateDevice(request.Muid, request.ClientId, request.DeviceToken); err != nil {
		log.Error(err)
	}
	err = protocol.NewSuccessWithMessage("更新成功")
	return
}