package binary_request

import (
	"encoding/json"
	"git.sxidc.com/student-physical-examination/contract_lock_sdk/http"
	"git.sxidc.com/student-physical-examination/contract_lock_sdk/model/common"
	"os"
)

type BinarySignV2Request struct {
	// <ext>core:true</ext> 【数据签名主题】数据签名主题 【作用】  定义数据签名的标题，便于后续在前台显示数据签名列表时区分显示每条数据 【传参】 最大长度：500（包含） 【特殊说明】 若未传，则默认按【数据签名-数据签名id】作为主题名称
	Subject string `json:"subject,omitempty"`
	// <ext>core:true</ext> 【数据签名文件】数据签名文件 【作用】 传入签署的业务数据文件（使用数字证书签署整份文件） 例如：医院的病历系统中存在一份.txt格式的病历单，则可以将病历单文件传入接口进行签署 【传参】 1、支持的文件格式：pdf， xlsx，pptx， docx， doc， wps， xls， ppt， png， webp， tiff，xml，xht，xhtml，htm，html，txt，jpg，jpeg，gif，avi，zip，rtf。 2、数据签名文件和数据签名内容必传其一，均传入以数据签名文件为准。
	Data *os.File `json:"data,omitempty"`
	// <ext>core:true</ext> 【数据签名内容】数据签名内容 【作用】 以字符串的形式传入签署的业务数据（使用数字证书签署数据流） 例如：采购系统需要签署一份采购表单，采购表单本身不是文件只是表单上一串数据，则可传入数据进行签署 【传参】 数据签名文件和数据签名内容必传其一，均传入以数据签名文件为准。
	DataString string `json:"dataString,omitempty"`
	// <ext>core:true</ext> 【签名算法】签名算法 【作用】 指定签署使用的签名算法 1、RSA国际算法：即使用RSA数字证书进行数据签名 2、SM2国密算法：即使用SM2数字证书进行数据签名 3、RSA国际+SM2国密双算法：需使用RSA+SM2两种数字证书进行数据签名 4、不传值时以电子签章管理后台【签名算法配置 】为准 【传参】 取值范围：RSA（RSA国际算法），SM2（SM2国密算法），SM2WithRSA（RSA+SM2两种数字证书）；不传值默认为：电子签章管理后台配置。
	DigestSigAlgType string `json:"digestSigAlgType,omitempty"`
	// <ext>core:true</ext> 【签署方式】签署方式 【作用】 1、使用印章签署：使用接口指定的印章签署数据 2、使用签名签署 ：使用接口指定的签名签署数据，此时Signatory中的operator不能为空 【传参】 取值范围：COMPANY（使用印章签署），PERSONAL（使用签名签署）；不传值默认为：COMPANY（使用印章签署）。
	TenantType string `json:"tenantType,omitempty"`
	// <ext>inner-type:Json<BinarySignatory>;core:true</ext> 【签署主体信息】签署主体信息 【作用】 签署数据签名的签署人、以及使用印章或签名
	Signatory string `json:"signatory"`
	// <ext>core:true</ext> 【是否添加时间戳 】是否添加时间戳 【作用】  用户在签署页面是否可添加时间戳图片（日期图片） 【传参】 1、取值范围：true（可添加），false（不可添加）；不传值默认为：false（不可添加）。
	NeedTsa         string                  `json:"needTsa,omitempty"`
	SignatoryObject *common.BinarySignatory `json:"signatoryObject,omitempty"`
}

func (obj BinarySignV2Request) GetUrl() string {
	return "/binary/sign/v2"
}

func (obj BinarySignV2Request) GetHttpParameter() *http.HttpParameter {
	parameter := http.NewPostHttpParameter()
	parameter.AddParam("subject", obj.Subject)
	parameter.AddParam("dataString", obj.DataString)
	parameter.AddParam("digestSigAlgType", obj.DigestSigAlgType)
	parameter.AddParam("tenantType", obj.TenantType)
	parameter.AddParam("needTsa", obj.NeedTsa)
	parameter.AddFiles("data", obj.Data)
	if obj.SignatoryObject != nil {
		jsonBytes, _ := json.Marshal(obj.SignatoryObject)
		parameter.AddParam("signatory", string(jsonBytes))
	} else {
		parameter.AddParam("signatory", obj.Signatory)
	}
	return parameter
}
