package store

import (
	"context"
	"errors"

	"gorm.io/gorm"
)

// ErrUserExists 表示邮箱已注册（唯一约束冲突）。
var ErrUserExists = errors.New("email already registered")

// CreateUser 新建用户（密码已在调用方 bcrypt 哈希）。邮箱重复返回 ErrUserExists。
func (p *Postgres) CreateUser(ctx context.Context, email, name, passwordHash string) (*User, error) {
	if p.db == nil {
		return nil, errStoreDisabled
	}
	var existed int64
	p.db.WithContext(ctx).Model(&User{}).Where("email = ?", email).Count(&existed)
	if existed > 0 {
		return nil, ErrUserExists
	}
	u := &User{Email: email, Name: name, PasswordHash: passwordHash}
	if err := p.db.WithContext(ctx).Create(u).Error; err != nil {
		return nil, err
	}
	return u, nil
}

// GetUserByEmail 按邮箱取用户（登录用）。
func (p *Postgres) GetUserByEmail(ctx context.Context, email string) (*User, error) {
	if p.db == nil {
		return nil, errStoreDisabled
	}
	var u User
	if err := p.db.WithContext(ctx).Where("email = ?", email).First(&u).Error; err != nil {
		return nil, err
	}
	return &u, nil
}

// GetUserByID 按主键取用户（鉴权后取当前用户）。
func (p *Postgres) GetUserByID(ctx context.Context, id string) (*User, error) {
	if p.db == nil {
		return nil, errStoreDisabled
	}
	var u User
	if err := p.db.WithContext(ctx).First(&u, "id = ?", id).Error; err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, nil
		}
		return nil, err
	}
	return &u, nil
}
