package api

import (
	"github.com/status-im/status-go/eth-node/types"
	"github.com/status-im/status-go/multiaccounts"
	"github.com/status-im/status-go/multiaccounts/accounts"
	"github.com/status-im/status-go/params"
	"github.com/status-im/status-go/services/personal"
	"github.com/status-im/status-go/services/typeddata"
	"github.com/status-im/status-go/transactions"
)

// StatusBackend defines the contract for the Status.im service
type StatusBackend interface {
	// IsNodeRunning() bool                       // NOTE: Only used in tests
	StartNode(config *params.NodeConfig) error // NOTE: Only used in canary
	StartNodeWithKey(acc multiaccounts.Account, password string, keyHex string) error
	StartNodeWithAccount(acc multiaccounts.Account, password string) error
	StartNodeWithAccountAndConfig(account multiaccounts.Account, password string, settings accounts.Settings, conf *params.NodeConfig, subaccs []accounts.Account) error
	StopNode() error
	// RestartNode() error // NOTE: Only used in tests

	UpdateRootDataDir(datadir string)
	UpdateMailservers(enodes []string) error

	// SelectAccount(loginParams account.LoginParams) error
	OpenAccounts() error
	GetAccounts() ([]multiaccounts.Account, error)
	// SaveAccount(account multiaccounts.Account) error
	SaveAccountAndStartNodeWithKey(acc multiaccounts.Account, password string, settings accounts.Settings, conf *params.NodeConfig, subaccs []accounts.Account, keyHex string) error
	Recover(rpcParams personal.RecoverParams) (types.Address, error)
	Logout() error

	CallPrivateRPC(inputJSON string) (string, error)
	CallRPC(inputJSON string) (string, error)
	GetNodesFromContract(rpcEndpoint string, contractAddress string) ([]string, error)
	HashTransaction(sendArgs transactions.SendTxArgs) (transactions.SendTxArgs, types.Hash, error)
	HashTypedData(typed typeddata.TypedData) (types.Hash, error)
	ResetChainData() error
	SendTransaction(sendArgs transactions.SendTxArgs, password string) (hash types.Hash, err error)
	SendTransactionWithSignature(sendArgs transactions.SendTxArgs, sig []byte) (hash types.Hash, err error)
	SignHash(hexEncodedHash string) (string, error)
	SignMessage(rpcParams personal.SignParams) (types.HexBytes, error)
	SignTypedData(typed typeddata.TypedData, address string, password string) (types.HexBytes, error)

	ConnectionChange(typ string, expensive bool)
	AppStateChange(state string)

	InjectChatAccount(chatKeyHex, encryptionKeyHex string) error // NOTE: Only used in lib and in tests
	ExtractGroupMembershipSignatures(signaturePairs [][2]string) ([]string, error)
	SignGroupMembership(content string) (string, error)

	EnableInstallation(installationID string) error
	DisableInstallation(installationID string) error
}