package workerschema

import (
	"errors"
	"net/url"

	"github.com/coreos/go-oidc/oidc"
)

func MapSchemaClientToClientIdentity(sc Client) (oidc.ClientIdentity, error) {
	ci := oidc.ClientIdentity{
		Credentials: oidc.ClientCredentials{
			ID: sc.Id,
		},
		Metadata: oidc.ClientMetadata{
			RedirectURLs: make([]url.URL, len(sc.RedirectURIs)),
		},
	}

	for i, ru := range sc.RedirectURIs {
		if ru == "" {
			return oidc.ClientIdentity{}, errors.New("redirect URL empty")
		}

		u, err := url.Parse(ru)
		if err != nil {
			return oidc.ClientIdentity{}, errors.New("redirect URL invalid")
		}

		ci.Metadata.RedirectURLs[i] = *u
	}

	return ci, nil
}

func MapClientIdentityToSchemaClient(c oidc.ClientIdentity) Client {
	cl := Client{
		Id:           c.Credentials.ID,
		RedirectURIs: make([]string, len(c.Metadata.RedirectURLs)),
	}
	for i, u := range c.Metadata.RedirectURLs {
		cl.RedirectURIs[i] = u.String()
	}
	return cl
}

func MapClientIdentityToSchemaClientWithSecret(c oidc.ClientIdentity) ClientWithSecret {
	cl := ClientWithSecret{
		Id:           c.Credentials.ID,
		Secret:       c.Credentials.Secret,
		RedirectURIs: make([]string, len(c.Metadata.RedirectURLs)),
	}
	for i, u := range c.Metadata.RedirectURLs {
		cl.RedirectURIs[i] = u.String()
	}
	return cl
}