package e2e

import (
	"fmt"

	jww "github.com/spf13/jwalterweatherman"
	"gitlab.com/elixxir/client/cmix/identity/receptionID"
	"gitlab.com/elixxir/client/cmix/rounds"
	"gitlab.com/elixxir/crypto/e2e"
	"gitlab.com/elixxir/primitives/format"
)

type UnsafeProcessor struct {
	m   *manager
	tag string
}

func (up *UnsafeProcessor) Process(ecrMsg format.Message,
	receptionID receptionID.EphemeralIdentity,
	round rounds.Round) {
	//check if the message is unencrypted
	jww.INFO.Printf("Unsafe PRocessed received: contents: %v, fp: %v, mac: %v, sih: %v",
		ecrMsg.GetContents(), ecrMsg.GetKeyFP(), ecrMsg.GetMac(), ecrMsg.GetSIH())
	unencrypted, sender := e2e.IsUnencrypted(ecrMsg)
	if !unencrypted && sender == nil {
		jww.ERROR.Printf("unencrypted message failed MAC check: %v",
			ecrMsg)
		return
	}
	if !unencrypted {
		jww.ERROR.Printf("Received a non unencrypted message in e2e "+
			"service %s, A message might have dropped!", up.tag)
	}

	//Parse
	message, done := up.m.partitioner.HandlePartition(sender,
		ecrMsg.GetContents(), nil)

	if done {
		message.RecipientID = receptionID.Source
		message.EphemeralID = receptionID.EphId
		message.Round = round
		message.Encrypted = false
		up.m.Switchboard.Speak(message)
	}
}

func (up *UnsafeProcessor) String() string {
	return fmt.Sprintf("Unsafe(%s)", up.m.myID)
}