package request

// 单元格的数据类型
const (
	DateDT                   = iota + 1 //日期
	EdbDT                               // 2 指标类型
	CustomTextDT                        // 3 自定义文本
	InsertDataDT                        // 4 插值（插入指标值，表格上，自动判断日期和指标的交集位置，插入值）
	PopInsertDataDT                     // 5 弹框插值（在表格上选择日期，然后空白单元格选择弹框并选择指标，插入该指标与该日期的值）
	FormulateCalculateDataDT            // 6 公式计算（A+B这种）
	InsertEdbCalculateDataDT            // 7 插入指标系统计算公式生成的值
	DateCalculateDataDT                 // 8 日期计算
)

// 单元格的日期类型类型
const (
	CustomDateT = iota //手动输入日期
	SystemDateT        // 系统日期
	EdbDateDT          // 导入指标日期（指标库的最新日期）

)

// 单元格的日期类型类型
const (
	SystemCurrDateT      = iota + 1 //系统当前日期
	SystemCalculateDateT            // 系统日期计算后的日期
	SystemFrequencyDateT            // 导入系统日期相关的指定频率（所在周/旬/月/季/半年/年的最后/最早一天）
)

// MixedTableReq 混合表格保存请求参数
type MixedTableReq struct {
	CellRelation string                    `description:"单元格关系"`
	Data         [][]MixedTableCellDataReq `description:"混合表格单元格参数"`
}

// MixedTableCellDataReq 混合表格单元格参数
type MixedTableCellDataReq struct {
	Uid             string      `description:"单元格唯一标识"`
	DataType        int         `description:"数据类型，1：日期，2：指标，3：自定义文本，4：插值"`
	DataTime        string      `description:"所属日期"`
	DataTimeType    int         `description:"日期类型：0：手动输入日期(固定日期)；1：导入系统日期；；3：导入指标日期（指标库的最新日期）；"`
	EdbInfoId       int         `description:"指标id"`
	ShowValue       string      `description:"展示值"`
	Value           string      `description:"实际值和配置"`
	Extra           string      `description:"额外参数"`
	ShowStyle       string      `description:"展示的样式配置"`
	ShowFormatValue interface{} `description:"样式处理后的值"`
	MerData         *struct {
		Type string `json:"type"`
		Mer  struct {
			SKey    string `json:"sKey"`
			Rowspan int    `json:"rowspan"`
			Colspan int    `json:"colspan"`
			Row     int    `json:"row"`
			Col     int    `json:"col"`
		} `json:"mer"`
	} `json:"merData" description:"合并单元格"`
}

// CellRelationConf
// @Description: 单元格的关系配置结构体
type CellRelationConf struct {
	CellRelation
	//Type         int          `json:"type" description:"数据类型，跟MixedTableCellDataReq的DataType保持一致"`
	//Key          string       `json:"key" description:"单元格的唯一标识"`
	RelationDate CellRelation `json:"relation_date"`
	RelationEdb  CellRelation `json:"relation_edb"`
}

// CellRelation
// @Description: 单元格的关系结构体
type CellRelation struct {
	Type int    `json:"type" description:"数据类型，跟MixedTableCellDataReq的DataType保持一致"`
	Key  string `json:"key" description:"单元格的唯一标识"`
}

// SystemDateConf
// @Description: 系统导入日期配置
type SystemDateConf struct {
	Source             int    `description:"类型，1：导入系统日期；2：导入系统日期计算后的日期；3：导入系统日期相关的指定频率"`
	CalculateNum       int    `description:"计算频度的数量"`
	CalculateFrequency string `description:"计算频度"`
	Frequency          string `description:"指定频度"`
	Day                string `description:"指定日期"`
}

// EdbDateConf
// @Description: 导入指标日期配置
type EdbDateConf struct {
	EdbInfoId int `description:"指标id"`
	EdbDateChangeConf
}

// EdbDateExtraConf
// @Description: 导入指标日期前移和日期变换
type EdbDateChangeConf struct {
	MoveForward int `description:"前移的期数"`
	DateChange  []*EdbDateConfDateChange
}

type EdbDateConfDateChange struct {
	Year         int
	Month        int
	Day          int
	Frequency    string `description:"频度变换"`
	FrequencyDay string `description:"频度的固定日期"`
	ChangeType   int    `description:"日期变换类型1日期位移，2指定频率"`
}

// MixedDateCalculateReq 混合表格日期计算
type MixedDateCalculateReq struct {
	Formula  string                   `description:"计算公式"`
	DateList []MixDateCalculateTagReq `description:"表格中的单元格"`
}

// MixDateCalculateConf 混合表格中的日期计算
type MixDateCalculateConf struct {
	Formula          string                `description:"计算公式"`
	RelationCellList []MixDateCalculateTag `description:"表格中的单元格"`
}

// MixDateCalculateTag 混合表格中的日期计算的关联单元格
type MixDateCalculateTag struct {
	Uid string `description:"单元格唯一值"`
	Tag string `description:"单元格对应标签"`
}

// MixDateCalculateTagReq 混合表格中的日期计算的关联单元格
type MixDateCalculateTagReq struct {
	Date string `description:"日期"`
	Tag  string `description:"指标对应标签"`
}

// MixCellShowStyle 混合表格 单元格样式展示计算
type MixCellShowStyle struct {
	Pn int    `description:"小数点位数增加或减少，正数表述增加，负数表示减少" json:"pn"`
	Nt string `description:"变换类型：number 小数点位数改变，percent百分比," json:"nt"`
}

type DateDataBeforeAfterReq struct {
	EdbInfoId   int
	Date        string
	Num         int
	MoveForward int `description:"前移的期数"`
	DateChange  []*EdbDateConfDateChange
}

// CalculateConf
// @Description: 计算公式
type CalculateConf struct {
	EdbInfoId     int         `description:"指标id"`
	DataTime      string      `description:"所属日期，这个日期有传递的话，那么就取上下两期+自己的数据；没有传就默认最近5期的数据"`
	Frequency     string      `description:"需要转换的频度"`
	Formula       interface{} `description:"计算公式，默认是string，实际上还需要转成其他样式"`
	Calendar      string      `description:"公历/农历"`
	MoveType      int         `description:"移动方式:1:领先(默认),2:滞后"`
	MoveFrequency string      `description:"移动频度"`
	Source        int         `description:"1：累计值转月；2：累计值转季；3：同比值；4：同差值；5：N数值移动平均数计算；6：环比值；7：环差值；8：升频；9：降频；10：时间移位；11：超季节性；12：年化；13：累计值；14：累计值年初至今；15：指数修匀；16：日均值"`

	EdbDateChangeConf
}

// BaseCalculateConf
// @Description: 基础计算公式（A+B）
type BaseCalculateConf struct {
	Formula             string         `description:"计算公式，默认是string，实际上还需要转成其他样式"`
	RelationEdbInfoList []RelationCell `description:"关联单元格（计算公式中关联的单元格，用于计算的时候去匹配）"`
}

// RelationCell
// @Description: 关联单元格的信息
type RelationCell struct {
	Tag string `description:"指标标签"`
	Row string `description:"第几行"`
	Key string `json:"key" description:"单元格的唯一标识"`
}
