package tokens

import (
	"errors"

	"github.com/golang-jwt/jwt/v4"
	"github.com/pocketbase/pocketbase/core"
	"github.com/pocketbase/pocketbase/models"
	"github.com/pocketbase/pocketbase/tools/security"
)

// NewRecordAuthToken generates and returns a new auth record authentication token.
func NewRecordAuthToken(app core.App, record *models.Record) (string, error) {
	if !record.Collection().IsAuth() {
		return "", errors.New("The record is not from an auth collection.")
	}

	return security.NewToken(
		jwt.MapClaims{
			"id":           record.Id,
			"type":         TypeAuthRecord,
			"collectionId": record.Collection().Id,
		},
		(record.TokenKey() + app.Settings().RecordAuthToken.Secret),
		app.Settings().RecordAuthToken.Duration,
	)
}

// NewRecordVerifyToken generates and returns a new record verification token.
func NewRecordVerifyToken(app core.App, record *models.Record) (string, error) {
	if !record.Collection().IsAuth() {
		return "", errors.New("The record is not from an auth collection.")
	}

	return security.NewToken(
		jwt.MapClaims{
			"id":           record.Id,
			"type":         TypeAuthRecord,
			"collectionId": record.Collection().Id,
			"email":        record.Email(),
		},
		(record.TokenKey() + app.Settings().RecordVerificationToken.Secret),
		app.Settings().RecordVerificationToken.Duration,
	)
}

// NewRecordResetPasswordToken generates and returns a new auth record password reset request token.
func NewRecordResetPasswordToken(app core.App, record *models.Record) (string, error) {
	if !record.Collection().IsAuth() {
		return "", errors.New("The record is not from an auth collection.")
	}

	return security.NewToken(
		jwt.MapClaims{
			"id":           record.Id,
			"type":         TypeAuthRecord,
			"collectionId": record.Collection().Id,
			"email":        record.Email(),
		},
		(record.TokenKey() + app.Settings().RecordPasswordResetToken.Secret),
		app.Settings().RecordPasswordResetToken.Duration,
	)
}

// NewRecordChangeEmailToken generates and returns a new auth record change email request token.
func NewRecordChangeEmailToken(app core.App, record *models.Record, newEmail string) (string, error) {
	return security.NewToken(
		jwt.MapClaims{
			"id":           record.Id,
			"type":         TypeAuthRecord,
			"collectionId": record.Collection().Id,
			"email":        record.Email(),
			"newEmail":     newEmail,
		},
		(record.TokenKey() + app.Settings().RecordEmailChangeToken.Secret),
		app.Settings().RecordEmailChangeToken.Duration,
	)
}
