package line_equation

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

type BatchAddChart struct {
	ChartInfo                       *data_manage.ChartInfo
	EdbMappingList                  []*data_manage.ChartEdbMapping
	MultipleGraphConfigChartMapping *data_manage.MultipleGraphConfigChartMapping
}

// CreateLineEquationChartAndEdb 批量新增拟合方程图表
func CreateLineEquationChartAndEdb(multipleGraphConfig *data_manage.MultipleGraphConfig, batchAddChartList []BatchAddChart) (err error) {
	o := orm.NewOrmUsingDB("data")
	tx, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			_ = tx.Rollback()
		} else {
			_ = tx.Commit()
		}
	}()
	// 新增批量配置
	newMultipleGraphConfigId, err := tx.Insert(multipleGraphConfig)
	if err != nil {
		return
	}
	multipleGraphConfig.MultipleGraphConfigId = int(newMultipleGraphConfigId)

	for k, v := range batchAddChartList {
		// 新增图表信息
		chartInfo := v.ChartInfo
		newId, tmpErr := tx.Insert(chartInfo)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		chartInfo.ChartInfoId = int(newId)
		batchAddChartList[k].ChartInfo = chartInfo

		// 指标mapping
		edbMappingList := v.EdbMappingList
		if len(edbMappingList) > 0 {
			for i := range edbMappingList {
				edbMappingList[i].ChartInfoId = chartInfo.ChartInfoId
			}
			_, err = tx.InsertMulti(len(edbMappingList), edbMappingList)
			if err != nil {
				return
			}
		}
		batchAddChartList[k].EdbMappingList = edbMappingList

		// 批量配置的关系表
		multipleGraphConfigChartMapping := v.MultipleGraphConfigChartMapping
		multipleGraphConfigChartMapping.ChartInfoId = chartInfo.ChartInfoId
		multipleGraphConfigChartMapping.MultipleGraphConfigId = multipleGraphConfig.MultipleGraphConfigId
		newMultipleGraphConfigChartMappingId, tmpErr := tx.Insert(v.MultipleGraphConfigChartMapping)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		multipleGraphConfigChartMapping.Id = int(newMultipleGraphConfigChartMappingId)
	}

	return
}

// CreateAndEditLineEquationChartAndEdb 批量新增/编辑拟合方程图表
func CreateAndEditLineEquationChartAndEdb(multipleGraphConfig *data_manage.MultipleGraphConfig, batchAddChartList []BatchAddChart, updateMultipleGraphConfigCols, updateChartCols []string) (err error) {
	o := orm.NewOrmUsingDB("data")
	tx, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			_ = tx.Rollback()
		} else {
			_ = tx.Commit()
		}
	}()
	// 编辑批量配置
	_, err = tx.Update(multipleGraphConfig, updateMultipleGraphConfigCols...)
	if err != nil {
		return
	}

	for k, v := range batchAddChartList {
		// 新增图表信息
		chartInfo := v.ChartInfo
		var isDelMapping bool
		{
			if chartInfo.ChartInfoId <= 0 {
				newId, tmpErr := tx.Insert(chartInfo)
				if tmpErr != nil {
					err = tmpErr
					return
				}
				chartInfo.ChartInfoId = int(newId)
				batchAddChartList[k].ChartInfo = chartInfo
			} else {
				// 更改图表信息
				_, err = tx.Update(chartInfo, updateChartCols...)
				if err != nil {
					return
				}
				isDelMapping = true
			}
		}

		// 图表与指标的关系表
		{
			// 先删除图表关联的指标关系，然后再新增
			if isDelMapping {
				sql := ` DELETE FROM  chart_edb_mapping WHERE chart_info_id=? `
				_, err = tx.Raw(sql, chartInfo.ChartInfoId).Exec()
				if err != nil {
					return
				}
			}
			// 指标mapping
			edbMappingList := v.EdbMappingList
			if len(edbMappingList) > 0 {
				for i := range edbMappingList {
					edbMappingList[i].ChartInfoId = chartInfo.ChartInfoId
				}
				_, err = tx.InsertMulti(len(edbMappingList), edbMappingList)
				if err != nil {
					return
				}
			}
			batchAddChartList[k].EdbMappingList = edbMappingList
		}

		// 批量配置的关系表
		{
			multipleGraphConfigChartMapping := v.MultipleGraphConfigChartMapping
			if multipleGraphConfigChartMapping.Id <= 0 {
				multipleGraphConfigChartMapping.ChartInfoId = chartInfo.ChartInfoId
				multipleGraphConfigChartMapping.MultipleGraphConfigId = multipleGraphConfig.MultipleGraphConfigId
				newMultipleGraphConfigChartMappingId, tmpErr := tx.Insert(v.MultipleGraphConfigChartMapping)
				if tmpErr != nil {
					err = tmpErr
					return
				}
				multipleGraphConfigChartMapping.Id = int(newMultipleGraphConfigChartMappingId)
			} else {
				if multipleGraphConfigChartMapping.ChartInfoId != chartInfo.ChartInfoId {
					multipleGraphConfigChartMapping.ChartInfoId = chartInfo.ChartInfoId
					_, err = tx.Update(multipleGraphConfigChartMapping, "ChartInfoId")
					if err != nil {
						return
					}
				}
			}
			batchAddChartList[k].MultipleGraphConfigChartMapping = multipleGraphConfigChartMapping
		}
	}

	return
}
