package models

import (
	"time"

	"go.mongodb.org/mongo-driver/v2/bson"
)

const (
	RoleOwner  = "owner"
	RoleAdmin  = "admin"
	RoleMember = "member"
)

func ValidRole(role string) bool {
	switch role {
	case RoleOwner, RoleAdmin, RoleMember:
		return true
	}
	return false
}

// Auth sources. A user's auth_source says who owns the row.
const (
	AuthLocal = "local"
	AuthOIDC  = "oidc"
	// AuthHQ marks a user projected from a Vantage HQ account. Its role,
	// password and existence are owned by HQ, and the instance API refuses to
	// change any of them locally — a role editable in two places is a role with
	// two answers.
	AuthHQ = "hq"
)

type User struct {
	ID           bson.ObjectID `bson:"_id,omitempty" json:"_id,omitempty"`
	UserID       string        `bson:"user_id" json:"user_id"`
	InstanceID   string        `bson:"instance_id" json:"instance_id"`
	Email        string        `bson:"email" json:"email"`
	PasswordHash string        `bson:"password_hash,omitempty" json:"-"`
	Role         string        `bson:"role" json:"role"`
	AuthSource   string        `bson:"auth_source" json:"auth_source"`
	// HQUserID is the customer_users.user_id this row was projected from,
	// absent on locally-created users.
	HQUserID  string     `bson:"hq_user_id,omitempty" json:"hq_user_id,omitempty"`
	CreatedAt time.Time  `bson:"created_at" json:"created_at"`
	LastLogin *time.Time `bson:"last_login,omitempty" json:"last_login,omitempty"`
}
