// Code generated by lark_sdk_gen. DO NOT EDIT.
/**
 * Copyright 2022 chyroc
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package lark

import (
	"context"
	"io"
)

// ExtractAIContractField 支持从doc、docx和pdf文件类型中提取合同字段
//
// 单租户限流: 10QPS, 同租户下的应用没有限流, 共享本租户的 10QPS 限流
//
// doc: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/ai/document_ai-v1/contract/field_extraction
// new doc: https://open.feishu.cn/document/server-docs/ai/document_ai-v1/contract/field_extraction
func (r *AIService) ExtractAIContractField(ctx context.Context, request *ExtractAIContractFieldReq, options ...MethodOptionFunc) (*ExtractAIContractFieldResp, *Response, error) {
	if r.cli.mock.mockAIExtractAIContractField != nil {
		r.cli.Log(ctx, LogLevelDebug, "[lark] AI#ExtractAIContractField mock enable")
		return r.cli.mock.mockAIExtractAIContractField(ctx, request, options...)
	}

	req := &RawRequestReq{
		Scope:                 "AI",
		API:                   "ExtractAIContractField",
		Method:                "POST",
		URL:                   r.cli.openBaseURL + "/open-apis/document_ai/v1/contract/field_extraction",
		Body:                  request,
		MethodOption:          newMethodOption(options),
		NeedTenantAccessToken: true,
		IsFile:                true,
	}
	resp := new(extractAIContractFieldResp)

	response, err := r.cli.RawRequest(ctx, req, resp)
	return resp.Data, response, err
}

// MockAIExtractAIContractField mock AIExtractAIContractField method
func (r *Mock) MockAIExtractAIContractField(f func(ctx context.Context, request *ExtractAIContractFieldReq, options ...MethodOptionFunc) (*ExtractAIContractFieldResp, *Response, error)) {
	r.mockAIExtractAIContractField = f
}

// UnMockAIExtractAIContractField un-mock AIExtractAIContractField method
func (r *Mock) UnMockAIExtractAIContractField() {
	r.mockAIExtractAIContractField = nil
}

// ExtractAIContractFieldReq ...
type ExtractAIContractFieldReq struct {
	File         io.Reader `json:"file,omitempty"`           // 合同字段解析的源文件, 当前只支持pdf, doc, docx三种类型的文件, 示例值: file binary
	PdfPageLimit int64     `json:"pdf_page_limit,omitempty"` // pdf页数限制, 太长会导致latency增加, 最大允许100页, 示例值: 15
	OcrMode      string    `json:"ocr_mode,omitempty"`       // ocr 参数, 当前支持force, pdf, unused三种格式, 示例值: "auto", 可选值有: force: pdf类型文件直接走OCR解析, auto: pdf类型文件先走本地解析, 无法解析（扫描/图片版）再走OCR, unused: 不调用OCR, 扫描/图片PDF返回不可解析信息
}

// ExtractAIContractFieldResp ...
type ExtractAIContractFieldResp struct {
	FileID   string                                `json:"file_id,omitempty"`   // 文件的唯一id
	Price    *ExtractAIContractFieldRespPrice      `json:"price,omitempty"`     // 总交易金额
	Time     *ExtractAIContractFieldRespTime       `json:"time,omitempty"`      // 期限相关信息, 包括开始日期、结束日期、有效时长
	Copy     *ExtractAIContractFieldRespCopy       `json:"copy,omitempty"`      // 盖章份数
	Currency *ExtractAIContractFieldRespCurrency   `json:"currency,omitempty"`  // 币种
	Header   string                                `json:"header,omitempty"`    // 合同标题
	BodyInfo []*ExtractAIContractFieldRespBodyInfo `json:"body_info,omitempty"` // 主体信息
	BankInfo []*ExtractAIContractFieldRespBankInfo `json:"bank_info,omitempty"` // 银行信息
}

// ExtractAIContractFieldRespBankInfo ...
type ExtractAIContractFieldRespBankInfo struct {
	BankType string                                   `json:"bank_type,omitempty"` // 甲乙方信息类型, 可选值有: buy_bank: 甲方银行, sell_bank: 乙方银行, third_bank: 第三方银行, unceratin_bank: 其他方银行
	Value    *ExtractAIContractFieldRespBankInfoValue `json:"value,omitempty"`     // 值
}

// ExtractAIContractFieldRespBankInfoValue ...
type ExtractAIContractFieldRespBankInfoValue struct {
	AccountName   string `json:"account_name,omitempty"`   // 账户名
	BankName      string `json:"bank_name,omitempty"`      // 银行名称
	AccountNumber string `json:"account_number,omitempty"` // 账户ID
	Phone         string `json:"phone,omitempty"`          // 电话
	Contacts      string `json:"contacts,omitempty"`       // 联系人
	TaxNumber     string `json:"tax_number,omitempty"`     // 传真号码
	Address       string `json:"address,omitempty"`        // 联系地址
	IDNumber      string `json:"id_number,omitempty"`      // id号
	Email         string `json:"email,omitempty"`          // 邮箱
}

// ExtractAIContractFieldRespBodyInfo ...
type ExtractAIContractFieldRespBodyInfo struct {
	BodyType string                                   `json:"body_type,omitempty"` // 主体类型, 可选值有: buy: 甲方主体, sell: 乙方主体, third: 第三方、其他方主体
	Value    *ExtractAIContractFieldRespBodyInfoValue `json:"value,omitempty"`     // 值
}

// ExtractAIContractFieldRespBodyInfoValue ...
type ExtractAIContractFieldRespBodyInfoValue struct {
	Address             string `json:"address,omitempty"`              // 地址
	Contacts            string `json:"contacts,omitempty"`             // 联系人
	Email               string `json:"email,omitempty"`                // 邮箱
	Phone               string `json:"phone,omitempty"`                // 电话
	IDNumber            string `json:"id_number,omitempty"`            // ID
	LegalRepresentative string `json:"legal_representative,omitempty"` // 法人代表
	Party               string `json:"party,omitempty"`                // 当事人
}

// ExtractAIContractFieldRespCopy ...
type ExtractAIContractFieldRespCopy struct {
	CopyNum      int64  `json:"copy_num,omitempty"`      // 盖章份数
	OriginalCopy string `json:"original_copy,omitempty"` // 从原文中抽取的盖章份数
	Key          string `json:"key,omitempty"`           // 盖章文件类型
	Text         string `json:"text,omitempty"`          // 原文有关盖章份数的描述
}

// ExtractAIContractFieldRespCurrency ...
type ExtractAIContractFieldRespCurrency struct {
	CurrencyName string `json:"currency_name,omitempty"` // 币种名称
	CurrencyText string `json:"currency_text,omitempty"` // 币种符号
}

// ExtractAIContractFieldRespPrice ...
type ExtractAIContractFieldRespPrice struct {
	ContractPrice         float64 `json:"contract_price,omitempty"`          // 交易金额
	ContractPriceOriginal string  `json:"contract_price_original,omitempty"` // 从原文中抽取的交易金额
	Text                  string  `json:"text,omitempty"`                    // 原文中描述交易金额的文字
}

// ExtractAIContractFieldRespTime ...
type ExtractAIContractFieldRespTime struct {
	TimeStart         string                                     `json:"time_start,omitempty"`          // 开始时间
	TimeEnd           string                                     `json:"time_end,omitempty"`            // 结束时间
	OriginalTimeStart string                                     `json:"original_time_start,omitempty"` // 原文中抽取出的开始时间
	OriginalTimeEnd   string                                     `json:"original_time_end,omitempty"`   // 原文中抽取出的结束时间
	TextStart         string                                     `json:"text_start,omitempty"`          // 原文中关于开始时间的描述
	TextEnd           string                                     `json:"text_end,omitempty"`            // 原文中关于结束时间的描述
	InitialTerm       *ExtractAIContractFieldRespTimeInitialTerm `json:"initial_term,omitempty"`        // 合同持续时长
	TextInitialTerm   string                                     `json:"text_initial_term,omitempty"`   // 原文中关于持续时间的描述
}

// ExtractAIContractFieldRespTimeInitialTerm ...
type ExtractAIContractFieldRespTimeInitialTerm struct {
	InitialTime string `json:"initial_time,omitempty"` // 合同持续时长
	InitialUnit string `json:"initial_unit,omitempty"` // 持续时长单位
}

// extractAIContractFieldResp ...
type extractAIContractFieldResp struct {
	Code  int64                       `json:"code,omitempty"` // 错误码, 非 0 表示失败
	Msg   string                      `json:"msg,omitempty"`  // 错误描述
	Data  *ExtractAIContractFieldResp `json:"data,omitempty"`
	Error *ErrorDetail                `json:"error,omitempty"`
}
