// Package portal contains the code for the routes portal
package portal

import (
	"fmt"
	"strings"

	"github.com/pomerium/pomerium/config"
	"github.com/pomerium/pomerium/internal/urlutil"
	"github.com/pomerium/pomerium/pkg/zero/importutil"
)

// A Route is a portal route.
type Route struct {
	ID             string `json:"id"`
	Name           string `json:"name"`
	Type           string `json:"type"`
	From           string `json:"from"`
	Description    string `json:"description"`
	ConnectCommand string `json:"connect_command,omitempty"`
	LogoURL        string `json:"logo_url"`
}

// RoutesFromConfigRoutes converts config routes into portal routes.
func RoutesFromConfigRoutes(routes []*config.Policy) []Route {
	prs := make([]Route, len(routes))
	for i, route := range routes {
		pr := Route{}
		pr.ID = route.ID
		if pr.ID == "" {
			pr.ID = fmt.Sprintf("%x", route.MustRouteID())
		}
		pr.Name = route.Name
		pr.From = route.From
		fromURL, err := urlutil.ParseAndValidateURL(route.From)
		if err == nil {
			if strings.HasPrefix(fromURL.Scheme, "tcp+") {
				pr.Type = "tcp"
				if len(fromURL.Path) > 1 {
					pr.ConnectCommand = "pomerium-cli tcp " + fromURL.String()
				} else {
					pr.ConnectCommand = "pomerium-cli tcp " + fromURL.Host
				}
			} else if strings.HasPrefix(fromURL.Scheme, "udp+") {
				pr.Type = "udp"
				pr.ConnectCommand = "pomerium-cli udp " + fromURL.Host
				if len(fromURL.Path) > 1 {
					pr.ConnectCommand = "pomerium-cli udp " + fromURL.String()
				} else {
					pr.ConnectCommand = "pomerium-cli udp " + fromURL.Host
				}
			} else {
				pr.Type = "http"
			}
		} else {
			pr.Type = "http"
		}
		pr.Description = route.Description
		pr.LogoURL = route.LogoURL
		prs[i] = pr
	}
	// generate names if they're empty
	for i, name := range importutil.GenerateRouteNames(routes) {
		if prs[i].Name == "" {
			prs[i].Name = name
		}
	}
	return prs
}