package model

import (
	"time"

	"github.com/lib/pq"

	"github.com/caos/zitadel/internal/token/model"
)

const (
	TokenKeyTokenID       = "id"
	TokenKeyUserID        = "user_id"
	TokenKeyApplicationID = "application_id"
	TokenKeyUserAgentID   = "user_agent_id"
	TokenKeyExpiration    = "expiration"
	TokenKeyResourceOwner = "resource_owner"
)

type Token struct {
	ID            string         `json:"-" gorm:"column:id;primary_key"`
	CreationDate  time.Time      `json:"-" gorm:"column:creation_date"`
	ChangeDate    time.Time      `json:"-" gorm:"column:change_date"`
	ResourceOwner string         `json:"-" gorm:"column:resource_owner"`
	UserID        string         `json:"-" gorm:"column:user_id"`
	ApplicationID string         `json:"-" gorm:"column:application_id"`
	UserAgentID   string         `json:"-" gorm:"column:user_agent_id"`
	Audience      pq.StringArray `json:"-" gorm:"column:audience"`
	Scopes        pq.StringArray `json:"-" gorm:"column:scopes"`
	Expiration    time.Time      `json:"-" gorm:"column:expiration"`
	Sequence      uint64         `json:"-" gorm:"column:sequence"`
}

func TokenFromModel(token *model.Token) *Token {
	return &Token{
		ID:            token.ID,
		CreationDate:  token.CreationDate,
		ChangeDate:    token.ChangeDate,
		ResourceOwner: token.ResourceOwner,
		UserID:        token.UserID,
		ApplicationID: token.ApplicationID,
		UserAgentID:   token.UserAgentID,
		Audience:      token.Audience,
		Scopes:        token.Scopes,
		Expiration:    token.Expiration,
		Sequence:      token.Sequence,
	}
}

func TokenToModel(token *Token) *model.Token {
	return &model.Token{
		ID:            token.ID,
		CreationDate:  token.CreationDate,
		ChangeDate:    token.ChangeDate,
		ResourceOwner: token.ResourceOwner,
		UserID:        token.UserID,
		ApplicationID: token.ApplicationID,
		UserAgentID:   token.UserAgentID,
		Audience:      token.Audience,
		Scopes:        token.Scopes,
		Expiration:    token.Expiration,
		Sequence:      token.Sequence,
	}
}