package mysql

import (
	"context"

	"github.com/marmotedu/errors"
	"github.com/pingcap-inc/pinsights/internal/pkg/code"
	v1 "github.com/pingcap-inc/pinsights/model/v1"
	"gorm.io/gorm"
)

type users struct {
	db *gorm.DB
}

func newUsers(ds *datastore) *users {
	return &users{db: ds.db}
}

func (u *users) Create(ctx context.Context, user *v1.User) (*v1.User, error) {
	return user, u.db.Create(user).Error
}

func (u *users) Update(ctx context.Context, user *v1.User) error {
	return u.db.Save(user).Error
}

func (u *users) GetByAnyID(ctx context.Context, anyID string) (*v1.User, error) {
	user := &v1.User{}
	err := u.db.Where("id = ? or authingID = ? or larkUserID = ?", anyID, anyID, anyID).First(&user).Error
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, errors.WithCode(code.ErrUserNotFound, "gorm.ErrRecordNotFound: %v", err.Error())
		}

		return nil, errors.WithCode(code.ErrDatabase, "gorm.ErrRecordNotFound: %v", err.Error())
	}

	return user, nil
}

func (u *users) GetByEmail(ctx context.Context, email string) (*v1.User, error) {
	user := &v1.User{}
	err := u.db.Where("email = ?", email).First(&user).Error
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, errors.WithCode(code.ErrUserNotFound, "gorm.ErrRecordNotFound: %v", err.Error())
		}

		return nil, errors.WithCode(code.ErrDatabase, "gorm.ErrRecordNotFound: %v", err.Error())
	}

	return user, nil
}
