package repository

import (
	"context"
	"gorm.io/gorm"
	"gorm.io/gorm/clause"
	"time"
)

// AccountDO 游戏帐号表
type AccountDO struct {
	Id             uint64    `gorm:"column:id;type:bigint(20) unsigned;primary_key;AUTO_INCREMENT" json:"id"`
	Email          string    `gorm:"column:email;type:varchar(64);comment:帐号;NOT NULL" json:"email"`
	Pwd            string    `gorm:"column:pwd;type:varchar(128);comment:密码;NOT NULL" json:"pwd"`
	Name           string    `gorm:"column:name;type:varchar(64);comment:用户名" json:"name"`
	Avatar         string    `gorm:"column:avatar;type:varchar(128);comment:头像" json:"avatar"`
	Gender         uint      `gorm:"column:gender;type:tinyint(4) unsigned;comment:性别。0:未知 ;1:男;2:女; 3:其他" json:"gender"`
	Phone          string    `gorm:"column:phone;type:varchar(32);comment:手机号码" json:"phone"`
	Status         uint      `gorm:"column:status;type:tinyint(4) unsigned;default:1;comment:是否有效。0:否;1:是;NOT NULL" json:"status"`
	RegisterSource string    `gorm:"column:register_source;type:varchar(16);comment:注册来源" json:"register_source"`
	LastIp         string    `gorm:"column:last_ip;type:varchar(32);comment:最近登录的ip" json:"last_ip"`
	Deleted        uint      `gorm:"column:deleted;type:tinyint(4) unsigned;default:0;comment:逻辑删除。 0:未删除;1:已删除;NOT NULL" json:"deleted"`
	CreateTime     time.Time `gorm:"column:create_time;type:timestamp;default:CURRENT_TIMESTAMP;comment:创建时间;NOT NULL" json:"create_time"`
	UpdateTime     time.Time `gorm:"column:update_time;type:timestamp;default:CURRENT_TIMESTAMP;comment:更新时间;NOT NULL" json:"update_time"`
}

func (m *AccountDO) TableName() string {
	return "g_account"
}

type gUserRepositoryImpl struct {
}

// FindByAccount 根据 account 和 pwd 查询用户
func (gUserRepositoryImpl) FindByAccount(ctx context.Context, account string) *AccountDO {
	db, ok := ctx.Value("db").(*gorm.DB)
	if !ok {
		db = Db
	}

	var model AccountDO
	sqlErr := db.Model(&model).Where("email=?", account).First(&model).Error

	if sqlErr != nil {
		return nil
	}

	return &model
}

// Create 创建用户
func (gUserRepositoryImpl) Create(ctx context.Context, data *AccountDO) error {
	db, ok := ctx.Value("db").(*gorm.DB)
	if !ok {
		db = Db
	}

	data.Deleted = 0

	return db.Clauses(clause.OnConflict{
		Columns:   []clause.Column{{Name: "email"}},
		DoUpdates: clause.AssignmentColumns([]string{"deleted"}),
	}).Create(data).Error
}

// UpdateById 根据ID更新用户
func (gUserRepositoryImpl) UpdateById(ctx context.Context, data *AccountDO) error {
	db, ok := ctx.Value("db").(*gorm.DB)
	if !ok {
		db = Db
	}

	sqlErr := db.Model(data).Where("id=?", data.Id).Updates(data).Error

	if sqlErr != nil {
		return sqlErr
	}
	return nil
}