package mysql

import (
	"context"

	"gorm.io/gorm"

	pchv1 "github.com/pingcap-inc/pchub/model/v1"
	"github.com/pingcap-inc/pchub/pkg/errors"

	v1 "github.com/pingcap-inc/security/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) (*pchv1.User, error) {
	user := &pchv1.User{}
	err := u.db.Where("email = ?", email).First(&user).Error
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, nil
		}

		return nil, err
	}

	return user, nil
}

func (u *user) SaveUser(_ context.Context, user v1.User) error {
	return u.db.Save(&user).Error
}

func (u *user) GetById(_ context.Context, id string) (*v1.User, error) {
	user := &v1.User{}
	err := u.db.Where("authingID = ?", id).First(&user).Error
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, nil
		}

		return nil, err
	}

	return user, nil
}

func (u *user) GetByOpenID(_ context.Context, OpenID string) (*v1.User, error) {
	user := &v1.User{}
	err := u.db.Where("larkOpenID = ?", OpenID).First(&user).Error
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, nil
		}

		return nil, err
	}

	return user, nil
}
