package api

import (
	sdk "git.cw.tr/mukan-network/mukan-sdk/types"

	channeltypesv2 "git.cw.tr/mukan-network/mukan-ibc/modules/core/04-channel/v2/types"
)

// IBCModule defines an interface that implements all the callbacks
// that modules must define as specified in IBC Protocol V2.
type IBCModule interface {
	// OnSendPacket is executed when a packet is being sent from sending chain.
	// this callback is provided with the source and destination IDs, the signer, the packet sequence and the packet data
	// for this specific application.
	OnSendPacket(
		ctx sdk.Context,
		sourceClient string,
		destinationClient string,
		sequence uint64,
		payload channeltypesv2.Payload,
		signer sdk.AccAddress,
	) error

	OnRecvPacket(
		ctx sdk.Context,
		sourceClient string,
		destinationClient string,
		sequence uint64,
		payload channeltypesv2.Payload,
		relayer sdk.AccAddress,
	) channeltypesv2.RecvPacketResult

	// OnTimeoutPacket is executed when a packet has timed out on the receiving chain.
	OnTimeoutPacket(
		ctx sdk.Context,
		sourceClient string,
		destinationClient string,
		sequence uint64,
		payload channeltypesv2.Payload,
		relayer sdk.AccAddress,
	) error

	// OnAcknowledgementPacket is executed when a packet gets acknowledged
	OnAcknowledgementPacket(
		ctx sdk.Context,
		sourceClient string,
		destinationClient string,
		sequence uint64,
		acknowledgement []byte,
		payload channeltypesv2.Payload,
		relayer sdk.AccAddress,
	) error
}

type WriteAcknowledgementWrapper interface {
	// WriteAcknowledgement writes the acknowledgement for an async acknowledgement
	WriteAcknowledgement(
		ctx sdk.Context,
		srcClientID string,
		sequence uint64,
		ack channeltypesv2.Acknowledgement,
	) error
}

// PacketDataUnmarshaler defines an optional interface which allows a middleware
// to request the packet data to be unmarshaled by the base application.
type PacketDataUnmarshaler interface {
	// UnmarshalPacketData unmarshals the packet data into a concrete type
	// the payload is provided and the packet data interface is returned
	UnmarshalPacketData(payload channeltypesv2.Payload) (any, error)
}
