package service

import (
	"errors"
	"gorm.io/gorm"
	gdb "wireguard-ui/global/client"
	"wireguard-ui/global/constant"
	"wireguard-ui/http/param"
	"wireguard-ui/http/vo"
	"wireguard-ui/model"
	"wireguard-ui/utils"
)

type user struct {
	*gorm.DB
}

func User() user {
	return user{
		gdb.DB,
	}
}

// CreateUser
// @description: 创建用户
// @receiver s
// @param user
// @return err
func (s user) CreateUser(user *model.User) (err error) {
	// 更新
	if user.Id != "" {
		updates := map[string]any{
			"nickname": user.Nickname,
			"avatar":   user.Avatar,
			"contact":  user.Contact,
			"is_admin": user.IsAdmin,
			"status":   user.Status,
		}

		return s.Model(&model.User{}).Where("id = ?", user.Id).Updates(&updates).Error
	}

	// 判断账号是否已经存在
	if _, err = s.GetUserByAccount(user.Account); err == nil {
		return errors.New("账号已经存在,请勿重复创建!")
	}

	defaultPassword := utils.Password().GenerateHashPassword("admin123")
	if user.Password == "" { // 没有密码给一个默认密码
		user.Password = defaultPassword
	} else {
		user.Password = utils.Password().GenerateHashPassword(user.Password)
	}

	// 没有头像就生成一个头像
	if user.Avatar == "" {
		user.Avatar, _ = utils.Avatar().GenerateAvatar(true)
	}

	// 创建
	return s.Create(&user).Error
}

// Delete
// @description: 删除用户
// @receiver s
// @param id
// @return error
func (s user) Delete(id string) error {
	return s.Model(&model.User{}).Where("id = ?", id).Delete(&model.User{}).Error
}

// List
// @description: 用户列表
// @receiver s
// @param p
// @return data
// @return count
// @return err
func (s user) List(p param.Page) (data []vo.UserItem, count int64, err error) {
	if err = s.Model(&model.User{}).
		Scopes(Paginate(p.Current, p.Size)).
		Order("created_at DESC").
		Find(&data).
		Offset(-1).Limit(-1).
		Count(&count).Error; err != nil {
		return
	}

	return
}

// GetUserByAccount
// @description: 根据账户获取用户信息
// @receiver s
// @param id
// @return data
// @return err
func (s user) GetUserByAccount(account string) (data vo.User, err error) {
	err = s.Model(&model.User{}).Where("account = ?", account).Take(&data).Error
	return
}

// GetUserById
// @description: 根据id获取用户信息
// @receiver s
// @param id
// @return data
// @return err
func (s user) GetUserById(id string) (data vo.User, err error) {
	err = s.Model(&model.User{}).Where("id = ?", id).Take(&data).Error
	return
}

// Status
// @description: 修改用户状态
// @receiver s
// @param id
// @return error
func (s user) Status(id string, state constant.Status) error {
	return s.Model(&model.User{}).Where("id = ?", id).Update("status", state).Error
}

// ChangePassword
// @description: 修改密码
// @receiver s
// @param id
// @param password
// @return error
func (s user) ChangePassword(id, password string) error {
	return s.Model(&model.User{}).Where("id = ?", id).Update("password", utils.Password().GenerateHashPassword(password)).Error
}