package models

import (
	"eta/eta_index_lib/global"
	"fmt"
	"time"
)

// EdbTerminal 指标终端
type EdbTerminal struct {
	TerminalId   int       `gorm:"column:terminal_id;type:int(9) UNSIGNED;primaryKey;not null;"`
	Source       int       `gorm:"column:source;type:int(9) UNSIGNED;comment:指标来源类型;default:0;"`                  // 指标来源类型
	Name         string    `gorm:"column:name;type:varchar(255);comment:终端别名;"`                                   // 终端别名
	TerminalCode string    `gorm:"column:terminal_code;type:varchar(255);comment:终端编码,用于配置在机器上;"`                 // 终端编码,用于配置在机器上
	ServerUrl    string    `gorm:"column:server_url;type:varchar(255);comment:终端地址;"`                             // 终端地址
	Num          int       `gorm:"column:num;type:int(9) UNSIGNED;comment:终端最大指标数;default:0;"`                    // 终端最大指标数
	ModifyTime   time.Time `gorm:"column:modify_time;type:timestamp;comment:最近一次修改时间;default:CURRENT_TIMESTAMP;"` // 最近一次修改时间
	CreateTime   time.Time `gorm:"column:create_time;type:datetime;comment:创建时间;default:NULL;"`                   // 创建时间
	Status       int       `gorm:"column:status;type:tinyint(4);comment:状态,1启用,2禁用;not null;default:1;"`          // 状态,1启用,2禁用
	Value        string    `gorm:"column:value;type:text;comment:终端相关的凭证;"`                                       // 终端相关的凭证
	DirPath      string    `gorm:"column:dir_path;type:varchar(255);comment:终端存放的文件夹路径;default:NULL;"`            // 终端存放的文件夹路径
}

// GetEdbTerminalListBySource 根据指标来源类型获取所有的终端列表
func GetEdbTerminalListBySource(source int) (items []*EdbTerminal, err error) {
	sql := ` SELECT *  FROM edb_terminal WHERE source = ? and status=1 ORDER BY terminal_id ASC `
	err = global.DEFAULT_DB.Raw(sql, source).Find(&items).Error

	return
}

// GetEdbTerminalFirstBySource 根据指标来源类型获取配置的首个终端信息
func GetEdbTerminalFirstBySource(source int) (item *EdbTerminal, err error) {
	sql := ` SELECT *  FROM edb_terminal WHERE source = ? and status=1 ORDER BY terminal_id ASC Limit 1 `
	err = global.DEFAULT_DB.Raw(sql, source).First(&item).Error

	return
}

type TerminalCodeCountGroup struct {
	TerminalCode string
	Total        int
}

// GetEdbTerminalByCode 根据终端编码获取终端信息
func GetEdbTerminalByCode(terminalCode string) (item *EdbTerminal, err error) {
	sql := ` SELECT *  FROM edb_terminal WHERE terminal_code = ? `
	err = global.DEFAULT_DB.Raw(sql, terminalCode).First(&item).Error

	return
}

// GetEdbCountGroupByTerminal 获取终端code分组总数
func GetEdbCountGroupByTerminal(source int) (list []TerminalCodeCountGroup, err error) {
	sql := `select terminal_code,count(1) total from edb_info where source = ? AND no_update=0 AND terminal_code != '' group by terminal_code; `
	err = global.DEFAULT_DB.Raw(sql, source).Find(&list).Error

	return
}

type BaseIndexTerminalCode struct {
	TerminalCode string `description:"终端编码,用于配置在机器上"`
	IndexName    string
}

// GetBaseIndexTerminalCode 获取数据源的终端code
func GetBaseIndexTerminalCode(edbCode, tableName string) (item BaseIndexTerminalCode, err error) {
	sql := fmt.Sprintf(`select terminal_code, index_name from %s where index_code = ? `, tableName)
	err = global.DEFAULT_DB.Raw(sql, edbCode).First(&item).Error

	return
}