package models

import (
	"strings"

	"github.com/authorizerdev/authorizer/server/graph/model"
	"github.com/authorizerdev/authorizer/server/refs"
)

// Note: any change here should be reflected in providers/casandra/provider.go as it does not have model support in collection creation

// VerificationRequest model for db
type VerificationRequest struct {
	Key         string `json:"_key,omitempty" bson:"_key" cql:"_key,omitempty" dynamo:"key,omitempty"` // for arangodb
	ID          string `gorm:"primaryKey;type:char(36)" json:"_id" bson:"_id" cql:"id" dynamo:"id,hash"`
	Token       string `json:"token" bson:"token" cql:"jwt_token" dynamo:"token" index:"token,hash"`
	Identifier  string `gorm:"uniqueIndex:idx_email_identifier;type:varchar(64)" json:"identifier" bson:"identifier" cql:"identifier" dynamo:"identifier"`
	ExpiresAt   int64  `json:"expires_at" bson:"expires_at" cql:"expires_at" dynamo:"expires_at"`
	Email       string `gorm:"uniqueIndex:idx_email_identifier;type:varchar(256)" json:"email" bson:"email" cql:"email" dynamo:"email"`
	Nonce       string `json:"nonce" bson:"nonce" cql:"nonce" dynamo:"nonce"`
	RedirectURI string `json:"redirect_uri" bson:"redirect_uri" cql:"redirect_uri" dynamo:"redirect_uri"`
	CreatedAt   int64  `json:"created_at" bson:"created_at" cql:"created_at" dynamo:"created_at"`
	UpdatedAt   int64  `json:"updated_at" bson:"updated_at" cql:"updated_at" dynamo:"updated_at"`
}

func (v *VerificationRequest) AsAPIVerificationRequest() *model.VerificationRequest {
	id := v.ID
	if strings.Contains(id, Collections.VerificationRequest+"/") {
		id = strings.TrimPrefix(id, Collections.VerificationRequest+"/")
	}

	return &model.VerificationRequest{
		ID:          id,
		Token:       refs.NewStringRef(v.Token),
		Identifier:  refs.NewStringRef(v.Identifier),
		Expires:     refs.NewInt64Ref(v.ExpiresAt),
		Email:       refs.NewStringRef(v.Email),
		Nonce:       refs.NewStringRef(v.Nonce),
		RedirectURI: refs.NewStringRef(v.RedirectURI),
		CreatedAt:   refs.NewInt64Ref(v.CreatedAt),
		UpdatedAt:   refs.NewInt64Ref(v.UpdatedAt),
	}
}
