package repository

import (
	"fmt"
	"sort"
	"strings"
	"time"

	"be.ems/src/framework/database/db"
	"be.ems/src/framework/logger"
	"be.ems/src/modules/ne_data/model"
)

// 实例化数据层 KpiCReport 结构体
var NewKpiCReport = &KpiCReport{}

// KpiCReport 性能统计 数据层处理
type KpiCReport struct{}

// SelectGoldKPI 通过网元指标数据信息
func (r KpiCReport) SelectKPI(query model.KPICQuery) []model.KpiCReport {
	rows := []model.KpiCReport{}
	if query.NeType == "" {
		return rows
	}

	tx := db.DB("").Model(&model.KpiCReport{})
	// 表名
	tableName := fmt.Sprintf("kpi_c_report_%s", strings.ToLower(query.NeType))
	tx.Table(tableName)
	// 构建查询条件
	if query.RmUID != "" {
		tx = tx.Where("rm_uid = ?", query.RmUID)
	}
	if query.BeginTime != 0 {
		tx = tx.Where("created_at >= ?", query.BeginTime)
	}
	if query.EndTime != 0 {
		tx = tx.Where("created_at <= ?", query.EndTime)
	}
	// 查询数据
	if err := tx.Find(&rows).Error; err != nil {
		logger.Errorf("query find err => %v", err.Error())
		return rows
	}
	// 排序
	if query.SortField != "" {
		sortField := query.SortField
		sortOrder := query.SortOrder
		sort.SliceStable(rows, func(i, j int) bool {
			// 支持的排序字段映射
			fieldGetters := map[string]func(*model.KpiCReport) any{
				"id":        func(row *model.KpiCReport) any { return row.ID },
				"timeGroup": func(row *model.KpiCReport) any { return row.CreatedAt },
				"createdAt": func(row *model.KpiCReport) any { return row.CreatedAt },
				// 可添加更多支持的字段
			}

			// 获取字段 getter 函数
			getter, ok := fieldGetters[sortField]
			if !ok {
				// 非法字段，使用默认排序（id升序）
				return rows[i].ID < rows[j].ID
			}

			// 获取比较值
			valI, valJ := getter(&rows[i]), getter(&rows[j])

			// 根据字段类型进行比较
			switch v := valI.(type) {
			case int64:
				if sortOrder == "desc" {
					return v > valJ.(int64)
				}
				return v < valJ.(int64)
			case string:
				if sortOrder == "desc" {
					return v > valJ.(string)
				}
				return v < valJ.(string)
			default:
				// 不支持的字段类型，使用默认排序
				return rows[i].ID < rows[j].ID
			}
		})
	}
	return rows
}

// Insert 新增信息 返回新增数据ID
func (r KpiCReport) Insert(param model.KpiCReport) int64 {
	if param.NeType == "" {
		return 0
	}
	if param.CreatedAt == 0 {
		param.CreatedAt = time.Now().UnixMilli()
	}
	// 表名
	tableName := fmt.Sprintf("kpi_c_report_%s", strings.ToLower(param.NeType))
	// 执行插入
	if err := db.DB("").Table(tableName).Create(&param).Error; err != nil {
		logger.Errorf("insert err => %v", err.Error())
		return 0
	}
	return param.ID
}

// SelectKPITitle 网元对应的指标名称
func (r KpiCReport) SelectKPITitle(neType string) []model.KpiCTitle {
	rows := []model.KpiCTitle{}
	if neType == "" {
		return rows
	}
	tx := db.DB("").Model(&model.KpiCTitle{})
	// 构建查询条件
	tx = tx.Where("ne_type =?", neType)
	// 查询数据
	if err := tx.Find(&rows).Error; err != nil {
		logger.Errorf("query find err => %v", err.Error())
		return rows
	}
	return rows
}

// TitleLastKPIId 查询指标标题最后kpiid
func (r KpiCReport) TitleLastKPIId(neType string) string {
	tx := db.DB("").Model(&model.KpiCTitle{})
	tx = tx.Where("ne_type=?", neType)
	tx = tx.Select("kpi_id").Order("kpi_id DESC")
	// 查询数据
	var kpiId string = ""
	if err := tx.Limit(1).Find(&kpiId).Error; err != nil {
		logger.Errorf("query find err => %v", err.Error())
		return kpiId
	}
	return kpiId
}

// SelectByPageTitle 分页查询集合
func (r KpiCReport) TitleSelectByPage(query map[string]string) ([]model.KpiCTitle, int64) {
	tx := db.DB("").Model(&model.KpiCTitle{})
	// 查询条件拼接
	if v, ok := query["neType"]; ok && v != "" {
		tx = tx.Where("ne_type = ?", v)
	}
	if v, ok := query["status"]; ok && v != "" {
		tx = tx.Where("status = ?", v)
	} else {
		tx = tx.Where("status != ?", "2")
	}

	// 查询结果
	var total int64 = 0
	rows := []model.KpiCTitle{}

	// 查询数量 长度为0直接返回
	if err := tx.Count(&total).Error; err != nil || total <= 0 {
		return rows, total
	}

	// 分页
	pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"])
	tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize))

	// 排序
	if v, ok := query["sortField"]; ok && v != "" {
		sortSql := v
		if o, ok := query["sortOrder"]; ok && o != "" {
			if o == "desc" {
				sortSql += " desc "
			} else {
				sortSql += " asc "
			}
		}
		tx = tx.Order(sortSql)
	}

	// 查询数据
	if err := tx.Find(&rows).Error; err != nil {
		logger.Errorf("query err => %v", err)
	}

	return rows, total
}

// TitleSelect 网元对应的指标名称
func (r KpiCReport) TitleSelect(param model.KpiCTitle) []model.KpiCTitle {
	tx := db.DB("").Model(&model.KpiCTitle{})
	// 构建查询条件
	if param.NeType != "" {
		tx = tx.Where("ne_type =?", param.NeType)
	}
	if param.Title != "" {
		tx = tx.Where("title = ?", param.Title)
	}
	if param.Status != "" {
		tx = tx.Where("status = ?", param.Status)
	}
	// 查询数据
	rows := []model.KpiCTitle{}
	if err := tx.Find(&rows).Error; err != nil {
		logger.Errorf("query find err => %v", err.Error())
		return rows
	}
	return rows
}

// TitleInsert 新增信息
func (r KpiCReport) TitleInsert(param model.KpiCTitle) int64 {
	if param.CreatedBy != "" {
		param.UpdatedAt = time.Now().UnixMilli()
	}
	param.Status = "1"
	tx := db.DB("").Create(&param)
	if err := tx.Error; err != nil {
		logger.Errorf("CreateInBatches err => %v", err)
	}
	return param.ID
}

// TitleUpdate 修改信息
func (r KpiCReport) TitleUpdate(param model.KpiCTitle) int64 {
	if param.ID <= 0 {
		return 0
	}
	param.UpdatedAt = time.Now().UnixMilli()
	tx := db.DB("").Model(&model.KpiCTitle{})
	// 构建查询条件
	tx = tx.Where("id = ?", param.ID)
	tx = tx.Omit("id", "created_by")
	// 执行更新
	if err := tx.Updates(param).Error; err != nil {
		logger.Errorf("update err => %v", err.Error())
		return 0
	}
	return tx.RowsAffected
}

// TitleDeleteByIds 批量删除信息
func (r KpiCReport) TitleDeleteByIds(ids []int64) int64 {
	if len(ids) <= 0 {
		return 0
	}
	tx := db.DB("").Model(&model.KpiCTitle{})
	// 构建查询条件
	tx = tx.Where("id in ?", ids)
	if err := tx.Update("status", 2).Error; err != nil {
		logger.Errorf("update err => %v", err.Error())
		return 0
	}
	return tx.RowsAffected
}
