/*
 Copyright (C) BABEC. All rights reserved.
 Copyright (C) THL A29 Limited, a Tencent company. All rights reserved.

 SPDX-License-Identifier: Apache-2.0
*/

package standard

const (
	Topic_Evidence = "Evidence"
)

// CMEVI 长安链存证合约go接口
// https://git.chainmaker.org.cn/contracts/standard/-/blob/master/draft/CM-CS-221221-Evidence.md
type CMEVI interface {
	// Evidence 存证
	// @param id 必填,流水号
	// @param hash 必填,上链哈希值
	// @param metadata 可选,其他信息;比如:哈希的类型(文字,文件)、文字描述的json格式字符串,具体参考下方 Metadata 对象。
	// @return error 返回错误信息
	Evidence(id string, hash string, metadata string) error

	// ExistsOfHash 哈希是否存在
	// @param hash 必填,上链的哈希值
	// @return exist 存在:true,"true";不存在:false,"false"
	// @return err 错误信息
	ExistsOfHash(hash string) (exist bool, err error)

	// ExistsOfId ID是否存在
	// @param id 必填,上链的ID值
	// @return exist 存在:true,"true";不存在:false,"false"
	// @return err 错误信息
	ExistsOfId(id string) (exist bool, err error)

	// FindByHash 根据哈希查找
	// @param hash 必填,上链哈希值
	// @return evidence 上链时传入的evidence信息
	// @return err 返回错误信息
	FindByHash(hash string) (evidence *Evidence, err error)

	// FindById 根据id查找
	// @param id 必填,流水号
	// @return evidence 上链时传入的evidence信息
	// @return err 返回错误信息
	FindById(id string) (evidence *Evidence, err error)

	// EmitEvidenceEvent 发送存证事件
	EmitEvidenceEvent(id string, hash string, metadata string) error
}

type CMEVIOption interface {

	// EvidenceBatch 批量存证
	// @param evidences 必填,存证信息
	// @return error 返回错误信息
	EvidenceBatch(evidences []Evidence) error

	// UpdateEvidence 根据ID更新存证哈希和metadata
	// @param id 必填,已经在链上存证的流水号。 如果是新流水号返回错误信息不存在
	// @param hash 必填,上链哈希值。必须与链上已经存储的hash不同
	// @param metadata 可选,其他信息;具体参考下方 Metadata 对象。
	// @return error 返回错误信息
	// @desc 该方法由长安链社区志愿者@sunhuiyuan提供建议,感谢参与
	UpdateEvidence(id string, hash string, metadata string) error

	// FindHisById 根据ID流水号查找存证历史(可以使用go合约接口:sdk.Instance.NewHistoryKvIterForKey或NewIterator实现)
	// @param id 必填,流水号
	// @return string 上链时传入的evidence信息的各个版本JSON数组对象。如果之前上链没有调用过updateEvidence、效果等同于findById,数组大小为1;
	//                如果之前上链调用过updateEvidence,则结果数组长度>1。
	// @return error 返回错误信息
	// @desc 该方法由长安链社区志愿者@sunhuiyuan提供建议,感谢参与
	FindHisById(id string) (evidence Evidence, err error)
}

// Evidence 存证结构体
type Evidence struct {
	// Id 业务流水号
	Id string `json:"id"`
	// Hash 哈希值
	Hash string `json:"hash"`
	// TxId 存证时交易ID
	TxId string `json:"txId"`
	// BlockHeight 存证时区块高度
	BlockHeight int `json:"blockHeight"`
	// Timestamp 存证时区块时间
	Timestamp string `json:"timestamp"`
	// Metadata 可选,其他信息;具体参考下方 Metadata 对象。
	Metadata string `json:"metadata"`
}

// Metadata 可选信息建议字段,若包含以下相关信息存证,请采用以下字段
type Metadata struct {
	// HashType 哈希的类型,文字、文件、视频、音频等
	HashType string `json:"hashType"`
	// HashAlgorithm 哈希算法,sha256、sm3等
	HashAlgorithm string `json:"hashAlgorithm"`
	// Username 存证人,用于标注存证的身份
	Username string `json:"username"`
	// Timestamp 可信存证时间
	Timestamp string `json:"timestamp"`
	// ProveTimestamp 可信存证时间证明
	ProveTimestamp string `json:"proveTimestamp"`
	// 存证内容
	Content string `json:"content"`
	// 其他自定义扩展字段
	// ...
}