package controller

import (
	"github.com/go-openapi/runtime/middleware"
	"github.com/openziti/zrok/build"
	"github.com/openziti/zrok/controller/config"
	"github.com/openziti/zrok/rest_model_zrok"
	"github.com/openziti/zrok/rest_server_zrok/operations/metadata"
)

type configurationHandler struct {
	cfg *config.Config
}

func newConfigurationHandler(cfg *config.Config) *configurationHandler {
	return &configurationHandler{
		cfg: cfg,
	}
}

func (ch *configurationHandler) Handle(_ metadata.ConfigurationParams) middleware.Responder {
	data := &rest_model_zrok.Configuration{
		Version:             build.String(),
		InvitesOpen:         cfg.Invites != nil && cfg.Invites.InvitesOpen,
		RequiresInviteToken: cfg.Invites != nil && cfg.Invites.TokenStrategy == "store",
	}
	if cfg.Admin != nil {
		data.TouLink = cfg.Admin.TouLink
	}
	if cfg.Invites != nil {
		data.InviteTokenContact = cfg.Invites.TokenContact
	}
	if cfg.Passwords != nil {
		data.PasswordRequirements = &rest_model_zrok.PasswordRequirements{
			Length:                 int64(cfg.Passwords.Length),
			RequireCapital:         cfg.Passwords.RequireCapital,
			RequireNumeric:         cfg.Passwords.RequireNumeric,
			RequireSpecial:         cfg.Passwords.RequireSpecial,
			ValidSpecialCharacters: cfg.Passwords.ValidSpecialCharacters,
		}
	}
	return metadata.NewConfigurationOK().WithPayload(data)
}