package excel

import (
	"eta/eta_api/models/data_manage"
	"eta/eta_api/utils"
	"fmt"
	"github.com/beego/beego/v2/client/orm"
	"time"
)

type ExcelChartEdb struct {
	ExcelChartEdbId int       `orm:"column(excel_chart_edb_id);pk"`
	ExcelInfoId     int       `description:"表格id"`
	ChartInfoId     int       `description:"图表id"`
	EdbCode         string    `description:"指标编码"`
	EdbName         string    `description:"指标名称"`
	DateSequence    string    `description:"日期序列选区"`
	DataSequence    string    `description:"数据序列选区"`
	SysUserId       int       `description:"创建人"`
	SysUserRealName string    `description:"创建人姓名"`
	MaxData         float64   `description:"上限"`
	MinData         float64   `description:"下限"`
	IsOrder         bool      `description:"true:正序,false:逆序"`
	IsAxis          int       `description:"true:左轴,false:右轴"`
	EdbInfoType     int       `description:"true:标准指标,false:领先指标"`
	LeadValue       int       `description:"领先值"`
	LeadUnit        string    `description:"领先单位"`
	FromTag         string    `description:"标签"`
	ModifyTime      time.Time `description:"修改时间"`
	CreateTime      time.Time `description:"创建时间"`
}

func (e *ExcelChartEdb) TableName() string {
	return "excel_chart_edb"
}

// 新增
func (e *ExcelChartEdb) Add() (err error) {
	o := orm.NewOrmUsingDB("data")
	_, err = o.Insert(e)
	return
}

// 修改
func (e *ExcelChartEdb) Update(cols []string) (err error) {
	o := orm.NewOrmUsingDB("data")
	_, err = o.Update(e, cols...)
	return
}

// 删除
func (e *ExcelChartEdb) Delete() (err error) {
	o := orm.NewOrmUsingDB("data")
	_, err = o.Delete(e)
	return
}

type AddChartEdbAndDataItem struct {
	ChartEdb *ExcelChartEdb
	DateList []string  `description:"日期列表"`
	ValList  []float64 `description:"数据列表"`
}

// 同时添加指标和指标数据
func (e *ExcelChartEdb) AddChartEdbAndData(list []*AddChartEdbAndDataItem, chartInfo *data_manage.ChartInfo) (err error) {
	o, err := orm.NewOrmUsingDB("data").Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			_ = o.Rollback()
		} else {
			_ = o.Commit()
		}
	}()

	// 图表指标信息入库
	updateIds := make([]int, 0)
	for _, item := range list {
		err = addChartEdbAndData(o, item.ChartEdb, item.DateList, item.ValList)
		if err != nil {
			return
		}
		updateIds = append(updateIds, item.ChartEdb.ExcelChartEdbId)
	}

	//新增图表
	chartInfoId, err := o.Insert(chartInfo)
	if err != nil {
		return
	}

	//更新图表id
	sql := `update excel_chart_edb set chart_info_id = ? where excel_chart_edb_id in (` + utils.GetOrmInReplace(len(updateIds)) + `)`
	_, err = o.Raw(sql, chartInfoId, updateIds).Exec()
	return
}

func addChartEdbAndData(o orm.TxOrmer, chartEdb *ExcelChartEdb, dateList []string, valList []float64) (err error) {
	// 图表指标信息入库
	lastId, err := o.Insert(chartEdb)
	if err != nil {
		return
	}
	chartEdb.ExcelChartEdbId = int(lastId)

	// 图表指标数据入库
	addList := make([]*ExcelChartData, 0)
	if len(dateList) > 0 && len(valList) > 0 {
		for k, v := range dateList {
			chartData := &ExcelChartData{
				ExcelInfoId:     chartEdb.ExcelInfoId,
				ExcelChartEdbId: chartEdb.ExcelChartEdbId,
				DataTime:        v,
				Value:           valList[k],
				ModifyTime:      time.Now(),
				CreateTime:      time.Now(),
			}
			//时间戳
			currentDate, er := time.Parse(utils.FormatDate, v)
			if er != nil {
				err = fmt.Errorf("时间格式化失败 err:%v", er)
				return
			}
			timestamp := currentDate.UnixNano() / 1e6
			chartData.DataTimestamp = timestamp
			addList = append(addList, chartData)
			// data信息入库
			if len(addList) > 1000 {
				_, err = o.InsertMulti(len(addList), len(addList))
				if err != nil {
					return
				}
				addList = addList[:0]
			}
		}
	}

	// data信息入库
	if len(addList) > 0 {
		_, err = o.InsertMulti(len(addList), len(addList))
		if err != nil {
			return
		}
	}
	return
}

func GetExcelChartEdbMappingByExcelInfoId(excelInfoId int) (list []*ExcelChartEdb, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := ` SELECT *
             FROM excel_chart_edb 
			 WHERE excel_info_id=? 
             ORDER BY excel_chart_edb_id ASC `
	_, err = o.Raw(sql, excelInfoId).QueryRows(&list)
	return
}

func GetExcelChartInfoByExcelInfoId(excelInfoId int, charInfoIds []int) (list []*ExcelChartEdb, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := ` SELECT *
             FROM chart_info 
			 WHERE source=11 and chart_info_id in (utils.) 
             ORDER BY excel_chart_edb_id ASC `
	_, err = o.Raw(sql, excelInfoId).QueryRows(&list)
	return
}