package service

import (
	"fmt"
	"strconv"

	"be.ems/features/udm_user/model"
	"be.ems/features/udm_user/repo"
)

// 实例化服务层 ServiceUdmAuthUser 结构体
var NewServiceUdmAuthUser = &ServiceUdmAuthUser{
	repoAuthUser: *repo.NewRepoUdmAuthUser,
}

// ServiceUdmAuthUser UDM鉴权用户 服务层处理
type ServiceUdmAuthUser struct {
	repoAuthUser repo.RepoUdmAuthUser
}

// Save UDM鉴权用户-获取全部保存数据库
func (r *ServiceUdmAuthUser) Save(neID string) int64 {
	var num int64 = 0
	authArr := redisUdmAuthUserList()
	// 有数据才清空
	if len(authArr) == 0 {
		return num
	}
	go r.repoAuthUser.ClearAndInsert(neID, authArr)
	return int64(len(authArr))
}

// Page UDM签约用户-分页查询数据库
func (r *ServiceUdmAuthUser) Page(query map[string]any) map[string]any {
	return r.repoAuthUser.SelectPage(query)
}

// List UDM签约用户-查询数据库
func (r *ServiceUdmAuthUser) List(authUser model.UdmAuthUser) []model.UdmAuthUser {
	return r.repoAuthUser.SelectList(authUser)
}

// Insert UDM鉴权用户-新增单个
// imsi长度15，ki长度32，opc长度0或者32
func (r *ServiceUdmAuthUser) Insert(neID string, authUser model.UdmAuthUser) int64 {
	authUser.NeID = neID
	authUser.Status = "0"
	return r.repoAuthUser.Insert(authUser)
}

// Insert UDM鉴权用户-批量添加
func (r *ServiceUdmAuthUser) Inserts(neID string, authUser model.UdmAuthUser, num string) int64 {
	var arr []model.UdmAuthUser

	imsiVlen := len(authUser.Imsi)
	imsiV, err := strconv.Atoi(authUser.Imsi)
	if err != nil {
		return 0
	}

	numV, err := strconv.Atoi(num)
	if err != nil {
		return 0
	}

	authUser.NeID = neID
	authUser.Status = "0"
	for i := 0; i < numV; i++ {
		imsi := fmt.Sprint(imsiV + i)
		if len(imsi) < imsiVlen {
			imsi = fmt.Sprintf("%0*s", imsiVlen, imsi)
		}
		authUser.Imsi = imsi
		arr = append(arr, authUser)
	}

	return r.repoAuthUser.Inserts(arr)
}

// InsertCSV UDM鉴权用户-批量添加
func (r *ServiceUdmAuthUser) InsertCSV(neID string, data []map[string]string) int64 {
	var arr []model.UdmAuthUser
	for _, v := range data {
		var authUser model.UdmAuthUser
		authUser.NeID = neID
		authUser.Status = "0"
		if s, ok := v["imsi"]; ok {
			authUser.Imsi = s
		}
		if s, ok := v["ki"]; ok {
			authUser.Ki = s
		}
		if s, ok := v["algo"]; ok {
			authUser.AlgoIndex = s
		}
		if s, ok := v["amf"]; ok {
			authUser.Amf = s
		}
		if s, ok := v["opc"]; ok {
			authUser.Opc = s
		}

		if authUser.Imsi == "" {
			continue
		}
		arr = append(arr, authUser)
	}
	return r.repoAuthUser.Inserts(arr)
}

// InsertTxt UDM鉴权用户-批量添加
func (r *ServiceUdmAuthUser) InsertTxt(neID string, data [][]string) int64 {
	var arr []model.UdmAuthUser
	for _, v := range data {
		if len(v) < 4 {
			continue
		}
		var authUser model.UdmAuthUser
		authUser.NeID = neID
		authUser.Status = "0"
		authUser.Imsi = v[0]
		authUser.Ki = v[1]
		authUser.AlgoIndex = v[2]
		authUser.Amf = v[3]
		if len(v) == 5 {
			authUser.Opc = v[4]
		}

		if authUser.Imsi == "" {
			continue
		}
		arr = append(arr, authUser)
	}

	return r.repoAuthUser.Inserts(arr)
}

// Insert UDM鉴权用户-修改更新
func (r *ServiceUdmAuthUser) Update(neID string, authUser model.UdmAuthUser) int64 {
	return r.repoAuthUser.Update(neID, authUser)
}

// Insert UDM鉴权用户-删除单个
func (r *ServiceUdmAuthUser) Delete(neID, imsi string) int64 {
	return r.repoAuthUser.Delete(neID, imsi)
}

// Insert UDM鉴权用户-删除范围
func (r *ServiceUdmAuthUser) Deletes(neID, imsi, num string) int64 {
	return r.repoAuthUser.Deletes(neID, imsi, num)
}
