package excel

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

// ExcelEdbMapping excel与指标的关系表
type ExcelEdbMapping struct {
	ExcelEdbMappingId int       `orm:"column(excel_edb_mapping_id);pk"`
	ExcelInfoId       int       `description:"excel的id"`
	Source            int       `description:"表格来源，1：excel插件的表格，2：自定义表格，3：混合表格，4：自定义分析，默认：1"`
	EdbInfoId         int       `description:"计算指标id"`
	CreateTime        time.Time `description:"创建时间"`
	ModifyTime        time.Time `description:"修改时间"`
}

// AddExcelEdbMappingMulti 批量添加excel与指标的关系
func AddExcelEdbMappingMulti(items []*ExcelEdbMapping) (err error) {
	o := orm.NewOrmUsingDB("data")
	_, err = o.InsertMulti(len(items), items)
	return
}

// Add 添加excel与指标的关系
func (e *ExcelEdbMapping) Add() (err error) {
	o := orm.NewOrmUsingDB("data")
	_, err = o.Insert(e)
	return
}

// GetExcelEdbMappingByEdbInfoId 根据指标id获取配置关系
func GetExcelEdbMappingByEdbInfoId(edbInfoId int) (item *ExcelEdbMapping, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := ` SELECT *  FROM excel_edb_mapping WHERE 1=1 AND edb_info_id = ? `

	err = o.Raw(sql, edbInfoId).QueryRow(&item)
	return
}

// GetExcelEdbMappingByExcelInfoId 根据excel的id获取配置关系
func GetExcelEdbMappingByExcelInfoId(excelInfoId int) (items []*ExcelEdbMapping, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := ` SELECT *  FROM excel_edb_mapping AS a 
           join edb_info as b on a.edb_info_id = b.edb_info_id
           WHERE 1=1 AND a.excel_info_id = ? `
	_, err = o.Raw(sql, excelInfoId).QueryRows(&items)

	return
}

type ExcelEdbMappingItem struct {
	EdbInfoId        int    `description:"指标id"`
	UniqueCode       string `description:"唯一编码"`
	EdbName          string `description:"指标名称"`
	ClassifyId       int    `description:"分类id"`
	Frequency        string `description:"频度"`
	Unit             string `description:"单位"`
	CalculateFormula string `json:"-"`
	DateSequenceStr  string `description:"日期序列公式"`
	DataSequenceStr  string `description:"数据序列公式"`
}

// CalculateFormula 计算公式
type CalculateFormula struct {
	DateSequenceStr string `json:"DateSequenceStr"`
	DataSequenceStr string `json:"DataSequenceStr"`
}

// GetAllExcelEdbMappingItemByExcelInfoId 根据品种id获取所有的指标结果集
func GetAllExcelEdbMappingItemByExcelInfoId(excelInfoId int) (items []*ExcelEdbMappingItem, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := `SELECT a.edb_info_id,a.unique_code,a.edb_name,a.classify_id,a.frequency,a.unit,calculate_formula FROM edb_info AS a 
         JOIN excel_edb_mapping AS b ON a.edb_info_id=b.edb_info_id 
         WHERE b.excel_info_id = ? ORDER BY b.excel_edb_mapping_id ASC `
	_, err = o.Raw(sql, excelInfoId).QueryRows(&items)
	return
}

// GetNoCustomAnalysisExcelEdbMappingCount 根据指标id获取非自定义分析的关联关系
func GetNoCustomAnalysisExcelEdbMappingCount(edbInfoId int) (count int, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := ` SELECT COUNT(1) AS count FROM excel_edb_mapping a 
                          join excel_info b on a.excel_info_id=b.excel_info_id
                          WHERE edb_info_id=? AND a.source != 4 AND b.is_delete = 0`
	err = o.Raw(sql, edbInfoId).QueryRow(&count)
	return
}

// GetAllExcelEdbMappingByExcelInfoId 根据excel的id获取所有的指标
func GetAllExcelEdbMappingByExcelInfoId(excelInfoId int) (items []*ExcelEdbMapping, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := `SELECT a.* FROM  excel_edb_mapping a
         WHERE a.excel_info_id = ? ORDER BY a.excel_edb_mapping_id ASC `
	_, err = o.Raw(sql, excelInfoId).QueryRows(&items)
	return
}

// DeleteCustomAnalysisExcelEdbMappingByEdbInfoId
// @Description: 根据指标id删除与自定义分析表格的关系
// @author: Roc
// @datetime 2023-11-02 13:20:02
// @param excelInfoId int
// @return err error
func DeleteCustomAnalysisExcelEdbMappingByEdbInfoId(excelInfoId int) (err error) {
	o := orm.NewOrmUsingDB("data")
	sql := `DELETE FROM excel_edb_mapping WHERE source = ? AND edb_info_id = ? LIMIT 1`
	_, err = o.Raw(sql, utils.CUSTOM_ANALYSIS_TABLE, excelInfoId).Exec()

	return
}

// GetExcelEdbMappingItemByExcelInfoIdOrKeyword 根据表格ID或关键词获取指标
func GetExcelEdbMappingItemByExcelInfoIdOrKeyword(excelInfoId int, keyword string) (items []*ExcelEdbMappingItem, err error) {
	o := orm.NewOrmUsingDB("data")
	cond := `b.excel_info_id = ?`
	pars := make([]interface{}, 0)
	pars = append(pars, excelInfoId)
	if keyword != "" {
		cond += ` AND (a.edb_code LIKE ? OR a.edb_name LIKE ?)`
		pars = append(pars, keyword, keyword)
	}
	sql := fmt.Sprintf(`SELECT
			a.edb_info_id,
			a.unique_code,
			a.edb_name,
			a.classify_id,
			a.frequency,
			a.unit,
			calculate_formula
		FROM
			edb_info AS a
		JOIN excel_edb_mapping AS b ON a.edb_info_id = b.edb_info_id
		WHERE
			%s
		ORDER BY
			b.excel_edb_mapping_id ASC`, cond)
	_, err = o.Raw(sql, pars).QueryRows(&items)
	return
}
