package gophercloud

// ScopeOptsV3 allows a created token to be limited to a specific domain or project.
type ScopeOptsV3 struct {
	ProjectID   string `json:"scope.project.id,omitempty" not:"ProjectName,DomainID,DomainName"`
	ProjectName string `json:"scope.project.name,omitempty"`
	DomainID    string `json:"scope.project.id,omitempty" not:"ProjectName,ProjectID,DomainName"`
	DomainName  string `json:"scope.project.id,omitempty"`
}

type ScopeDomainV3 struct {
	ID   string `json:"id,omitempty"`
	Name string `json:"name,omitempty"`
}

type ScopeProjectDomainV3 struct {
	ID   string `json:"id,omitempty"`
	Name string `json:"name,omitempty"`
}

type ScopeProjectV3 struct {
	Domain *ScopeProjectDomainV3 `json:"domain,omitempty"`
	Name   string                `json:"name,omitempty"`
	ID     string                `json:"id,omitempty"`
}

type ScopeV3 struct {
	Domain  *ScopeDomainV3  `json:"domain,omitempty"`
	Project *ScopeProjectV3 `json:"project,omitempty"`
}

type DomainV3 struct {
	ID   string `json:"id,omitempty" xor:"Name"`
	Name string `json:"name,omitempty" xor:"ID"`
}

type UserV3 struct {
	ID       string    `json:"id,omitempty" xor:"Name"`
	Name     string    `json:"name,omitempty" xor:"ID"`
	Password string    `json:"password" required:"true"`
	Domain   *DomainV3 `json:"domain,omitempty" not:"Domain.ID,Domain.Name"`
}

type PasswordCredentialsV3 struct {
	User *UserV3 `json:"user" required:"true"`
}

type TokenCredentialsV3 struct {
	ID string `json:"id" required:"true"`
}

type IdentityCredentialsV3 struct {
	Methods             []string               `json:"methods" required:"true"`
	PasswordCredentials *PasswordCredentialsV3 `json:"password,omitempty" xor:"TokenCredentials"`
	TokenCredentials    *TokenCredentialsV3    `json:"token,omitempty" xor:"PasswordCredentials"`
}

type AuthOptionsV3 struct {
	Identity *IdentityCredentialsV3 `json:"identity" required:"true"`
	Scope    *ScopeV3               `json:"scope,omitempty"`
}

func (opts AuthOptionsV3) ToTokenV3CreateMap(scope *ScopeOptsV3) (map[string]interface{}, error) {
	if scope != nil {
		opts.Scope = &ScopeV3{
			Domain: &ScopeDomainV3{
				ID:   scope.DomainID,
				Name: scope.DomainName,
			},
			Project: &ScopeProjectV3{
				Domain: &ScopeProjectDomainV3{
					ID:   scope.DomainID,
					Name: scope.DomainName,
				},
				ID:   scope.ProjectID,
				Name: scope.ProjectName,
			},
		}
	}
	return BuildRequestBody(opts, "auth")
}
