package model

import (
	"fmt"

	"github.com/google/uuid"
)

// NewUserOpaqueIdentifier either creates a new UserOpaqueIdentifier or returns an error.
func NewUserOpaqueIdentifier(service, sectorID, username string) (id *UserOpaqueIdentifier, err error) {
	var opaqueID uuid.UUID

	if opaqueID, err = uuid.NewRandom(); err != nil {
		return nil, fmt.Errorf("unable to generate uuid: %w", err)
	}

	return &UserOpaqueIdentifier{
		Service:    service,
		SectorID:   sectorID,
		Username:   username,
		Identifier: opaqueID,
	}, nil
}

// UserOpaqueIdentifier represents an opaque identifier for a user. Commonly used with OAuth 2.0 and OpenID Connect.
type UserOpaqueIdentifier struct {
	ID       int    `db:"id" yaml:"id"`
	Service  string `db:"service" yaml:"service"`
	SectorID string `db:"sector_id" yaml:"sector_id"`
	Username string `db:"username" yaml:"username"`

	Identifier uuid.UUID `db:"identifier" yaml:"identifier"`
}

// UserOpaqueIdentifiersExport represents a UserOpaqueIdentifier export file.
type UserOpaqueIdentifiersExport struct {
	Identifiers []UserOpaqueIdentifier `yaml:"identifiers"`
}