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 BinarySignurlV2Request 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（数据签名文件）和dataString（数据签名内容）必传其一，均传入以数据签名文件为准。
	Data *os.File `json:"data,omitempty"`
	// <ext>core:true</ext> 【数据签名内容】数据签名内容 【作用】 以字符串的形式传入签署的业务数据（使用数字证书签署数据流） 例如：采购系统需要签署一份采购表单，采购表单本身不是文件只是表单上一串数据，则可传入数据进行签署 【传参】 data（数据签名文件）和dataString（数据签名内容）必传其一，均传入以数据签名文件为准。
	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、使用签名签署 ：链接页面仅返回签署人的个人签名，用户选择个人签名签署数据 3、使用印章或签名签署：链接页面同时返回印章和签名，用户自由选择使用印章或签名签署 【传参】 1、取值范围：COMPANY（使用印章签署），PERSONAL（使用签名签署）；不传值默认为：ALL（使用印章或签名签署）。 2、传值为COMPANY（使用印章签署）时，signatory（签署主体信息）下的company（法人单位）不能为空。
	TenantType string `json:"tenantType,omitempty"`
	// <ext>inner-type:Json<SignurlSignatory>;core:true</ext> 【签署主体信息】签署主体信息 【作用】 签署数据签名的签署人、以及使用印章或签名
	Signatory string `json:"signatory"`
	// <ext>core:true</ext> 【是否添加时间戳 】是否添加时间戳  【作用】  用户在签署页面是否可添加时间戳图片（日期图片） 【传参】 取值范围：true（可添加），false（不可添加）；不传值默认为：false（不可添加）。
	NeedTsa string `json:"needTsa,omitempty"`
	// <ext>inner-type:Json<PasswordFreeRequestStr></ext> 【免密设置】免密设置 【作用】 若签署人频繁进行数据签名时，每次都需要进行意愿校验（例如通过签署密码或验证码）影响签署效率。此参数可设置是否允许用户自行开启免密，开启后则在设置免密期间内无需重复校验签署意愿 【特殊说明】 可通过同时传入默认免密截止时间和默认免密范围预设免密规则
	PasswordFreeRequestStr string `json:"passwordFreeRequestStr,omitempty"`
	// 【免密签署时是否选择签署图片】免密签署时是否选择签署图片 【作用】： 设置免密期间签署时，是返回链接页面让用户选择签名/印章后完成签署，还是不返回页面通过接口直接使用指定印章或签名完成签署 【传参】: 取值范围：NEED_PAGE（选择签署图片），WITHOUT_PAGE（不选择签署图片）；不传值默认为：NEED_PAGE（选择签署图片）。
	NoPasswordSignWay string `json:"noPasswordSignWay,omitempty"`
	// 【客户端类型】客户端类型 【作用】 1、当请求的UserAgent无法自动判断返回的页面类型时，可通过此参数返回指定客户端的页面；方参数不传值时，将根据请求的UserAgent自动判断返回的页面类型 2、例如在微信小程序集成场景中，PC端小程序的UserAgent只能识别为PC端，但是需要使用H5端的页面 【传参】 取值范围：PC（返回PC页面），H5（返回H5页面）；不传值默认为：根据请求的UserAgent自动判断返回的页面类型。
	DeviceType string `json:"deviceType,omitempty"`
	// 【操作完成自动关闭页面】操作完成自动关闭页面 【作用】 用户在链接页面完成数据签名时，系统是否自动关闭链接页面 【传参】： 取值范围：true（自动关闭），false（不自动关闭）；不传值默认为：false（不自动关闭）。
	AutoClosePage string `json:"autoClosePage,omitempty"`
	// <ext>inner-type:Json<PersonSealImgSpec></ext> 【返回的图片规格】返回的图片规格 【作用】 控制返回的图片格式、图片大小
	PersonSealImgSpec string `json:"personSealImgSpec,omitempty"`
	// <ext>deprecated:true</ext> 【文件类型】文件类型 【特殊说明】 可选项：pdf, xlsx, pptx, docx, doc, wps, xls, ppt, png, webp, tiff,xml,xht,xhtml,htm,html,txt,jpg,jpeg,gif,avi,zip,rtf
	DataType string `json:"dataType,omitempty"`
	// 【意愿校验方式】意愿校验方式 【作用】 设置签署人在数据签名链接可使用的意愿校验方式，传入第一个为默认校验方式 【传参】 取值范围：FACE（人脸识别），PIN（验证码），PASSWORD（签署密码），MOBILE_DEVICE（移动设备验证）；可选多项；不传值默认为：PIN（验证码），PASSWORD（签署密码）；多个选项可用“,”隔开。 【特殊说明】 如果印章绑定了ukey或动态令牌，则仅能通过ukey和动态令牌校验 如果签名绑定了动态令牌，则仅能通过动态令牌校验身份
	CheckTypes                   string                                   `json:"checkTypes,omitempty"`
	PasswordFreeRequestStrObject *common.PasswordFreeRequestStr           `json:"passwordFreeRequestStrObject,omitempty"`
	SignatoryObject              *common.SignurlSignatory                 `json:"signatoryObject,omitempty"`
	PersonSealImgSpecObject      *common.PersonSealImgSpec                `json:"personSealImgSpecObject,omitempty"`
	PageConfig                   *common.BinarySignurlV2PageConfigRequest `json:"pageConfig,omitempty"`
}

func (obj BinarySignurlV2Request) GetUrl() string {
	return "/binary/signurl/v2"
}

func (obj BinarySignurlV2Request) 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.AddParam("noPasswordSignWay", obj.NoPasswordSignWay)
	parameter.AddParam("deviceType", obj.DeviceType)
	parameter.AddParam("autoClosePage", obj.AutoClosePage)
	parameter.AddParam("dataType", obj.DataType)
	parameter.AddParam("checkTypes", obj.CheckTypes)
	parameter.AddFiles("data", obj.Data)
	if obj.PageConfig != nil {
		parameter.AddParam("pageConfig.visitNum", obj.PageConfig.VisitNum)
		parameter.AddParam("pageConfig.expireTime", obj.PageConfig.ExpireTime)
		parameter.AddParam("pageConfig.invalidToPage", obj.PageConfig.InvalidToPage)
		parameter.AddParam("pageConfig.language", obj.PageConfig.Language)
		parameter.AddParam("pageConfig.hideHeader", obj.PageConfig.HideHeader)
	}
	if obj.PageConfig != nil && obj.PageConfig.PageStyle != nil {
		parameter.AddParam("pageConfig.pageStyle.themeColor", obj.PageConfig.PageStyle.ThemeColor)
	}
	if obj.PasswordFreeRequestStrObject != nil {
		jsonBytes, _ := json.Marshal(obj.PasswordFreeRequestStrObject)
		parameter.AddParam("passwordFreeRequestStr", string(jsonBytes))
	} else {
		parameter.AddParam("passwordFreeRequestStr", obj.PasswordFreeRequestStr)
	}
	if obj.SignatoryObject != nil {
		jsonBytes, _ := json.Marshal(obj.SignatoryObject)
		parameter.AddParam("signatory", string(jsonBytes))
	} else {
		parameter.AddParam("signatory", obj.Signatory)
	}
	if obj.PersonSealImgSpecObject != nil {
		jsonBytes, _ := json.Marshal(obj.PersonSealImgSpecObject)
		parameter.AddParam("personSealImgSpec", string(jsonBytes))
	} else {
		parameter.AddParam("personSealImgSpec", obj.PersonSealImgSpec)
	}
	return parameter
}
