package mysql

import (
	"context"

	"github.com/pingcap-inc/pingcat/internal/pkg/code"
	"gorm.io/gorm"

	"github.com/pingcap-inc/pchub/pkg/errors"

	v1 "github.com/pingcap-inc/pingcat/model/v1"
)

type user struct {
	db *gorm.DB
}

func newUser(ds *datastore) *user {
	return &user{db: ds.db}
}

func (u *user) GetByEmail(_ context.Context, email string) (*v1.User, error) {
	user := &v1.User{}
	err := u.db.Where("email = ?", email).First(&user).Error

	return user, dbNotFoundErrorWrap(err)
}

func (u *user) GetByAnyID(_ 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
}
