package repository

import (
	"be.ems/src/framework/datasource"
	"be.ems/src/framework/logger"
	"be.ems/src/framework/utils/repo"
	"be.ems/src/modules/network_data/model"
)

// 实例化数据层 UDMSubUser 结构体
var NewUDMSub = &UDMSubUser{}

// UDMSubUser UDM签约信息表 数据层处理
type UDMSubUser struct{}

// ClearAndInsert 清空ne_id后新增实体
func (r *UDMSubUser) ClearAndInsert(neId string, u []model.UDMSubUser) int64 {
	// 不指定neID时，用 TRUNCATE 清空表快
	// _, err := datasource.ExecDB("", "TRUNCATE TABLE u_sub_user", nil)
	result := datasource.DB("").Where("ne_id = ?", neId).Unscoped().Delete(&model.UDMSubUser{})
	if result.Error != nil {
		logger.Errorf("Delete err => %v", result.Error)
	}
	return r.Inserts(u)
}

// SelectPage 根据条件分页查询字典类型
func (r *UDMSubUser) SelectPage(query map[string]any) (int64, []model.UDMSubUser) {
	tx := datasource.DB("").Model(&model.UDMSubUser{})
	// 查询条件拼接
	if v, ok := query["imsi"]; ok && v != "" {
		tx = tx.Where("imsi like concat(concat('%', ?), '%')", v)
	}
	if v, ok := query["msisdn"]; ok && v != "" {
		tx = tx.Where("msisdn like concat(concat('%', ?), '%')", v)
	}
	if v, ok := query["neId"]; ok && v != "" {
		tx = tx.Where("ne_id =?", v)
	}
	if v, ok := query["imsis"]; ok && v != "" {
		tx = tx.Where("imsi in ?", v)
	}

	var total int64 = 0
	rows := []model.UDMSubUser{}

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

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

	// 排序
	if v, ok := query["sortField"]; ok && v != "" {
		sortSql := v.(string)
		if o, ok := query["sortOrder"]; ok && o != nil && v != "" {
			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 total, rows
}

// SelectList 根据实体查询
func (r *UDMSubUser) SelectList(u model.UDMSubUser) []model.UDMSubUser {
	tx := datasource.DB("").Model(&model.UDMSubUser{})
	// 查询条件拼接
	if u.IMSI != "" {
		tx = tx.Where("imsi = ?", u.IMSI)
	}
	if u.NeId != "" {
		tx = tx.Where("ne_id = ?", u.NeId)
	}

	// 查询数据
	arr := []model.UDMSubUser{}
	if err := tx.Order("imsi asc").Find(&arr).Error; err != nil {
		logger.Errorf("query err => %v", err)
	}
	return arr
}

// SelectByIMSIAndNeID 通过imsi和ne_id查询
func (r *UDMSubUser) SelectByIMSIAndNeID(imsi, neId string) model.UDMSubUser {
	tx := datasource.DB("").Model(&model.UDMSubUser{})
	item := model.UDMSubUser{}
	// 查询条件拼接
	tx = tx.Where("imsi = ? and ne_id = ?", imsi, neId)
	// 查询数据
	if err := tx.Order("imsi asc").Limit(1).Find(&item).Error; err != nil {
		logger.Errorf("query err => %v", err)
	}
	return item
}

// Insert 批量添加
func (r *UDMSubUser) Inserts(uArr []model.UDMSubUser) int64 {
	tx := datasource.DB("").CreateInBatches(uArr, 2000)
	if err := tx.Error; err != nil {
		logger.Errorf("CreateInBatches err => %v", err)
	}
	return tx.RowsAffected
}

// Delete 删除实体
func (r *UDMSubUser) Delete(imsi, neId string) int64 {
	tx := datasource.DefaultDB().Where("imsi = ? and ne_id = ?", imsi, neId).Delete(&model.UDMSubUser{})
	if err := tx.Error; err != nil {
		logger.Errorf("Delete err => %v", err)
	}
	return tx.RowsAffected
}

// DeletePrefixByIMSI 删除前缀匹配的实体
func (r *UDMSubUser) DeletePrefixByIMSI(imsiPrefix, neId string) int64 {
	tx := datasource.DefaultDB().Where("imsi like concat(?, '%') and ne_id = ?", imsiPrefix, neId).Delete(&model.UDMSubUser{})
	if err := tx.Error; err != nil {
		logger.Errorf("DeletePrefixByIMSI err => %v", err)
	}
	return tx.RowsAffected
}
