package setup

import (
	"context"

	"github.com/zitadel/zitadel/internal/command"
	"github.com/zitadel/zitadel/internal/config/systemdefaults"
	"github.com/zitadel/zitadel/internal/eventstore"
)

type externalConfigChange struct {
	es             *eventstore.Eventstore
	ExternalDomain string `json:"externalDomain"`
	ExternalSecure bool   `json:"externalSecure"`
	ExternalPort   uint16 `json:"externalPort"`

	currentExternalDomain string
	currentExternalSecure bool
	currentExternalPort   uint16
	defaults              systemdefaults.SystemDefaults
}

func (mig *externalConfigChange) Check(lastRun map[string]interface{}) bool {
	mig.currentExternalDomain, _ = lastRun["externalDomain"].(string)
	externalPort, _ := lastRun["externalPort"].(float64)
	mig.currentExternalPort = uint16(externalPort)
	mig.currentExternalSecure, _ = lastRun["externalSecure"].(bool)
	return mig.currentExternalSecure != mig.ExternalSecure ||
		mig.currentExternalPort != mig.ExternalPort ||
		mig.currentExternalDomain != mig.ExternalDomain
}

func (mig *externalConfigChange) Execute(ctx context.Context, _ eventstore.Event) error {
	cmd, err := command.StartCommands(
		mig.es,
		mig.defaults,
		nil,
		nil,
		nil,
		mig.ExternalDomain,
		mig.ExternalSecure,
		mig.ExternalPort,
		nil,
		nil,
		nil,
		nil,
		nil,
		nil,
		nil,
		nil,
		nil,
		nil,
		nil,
		0,
		0,
		0,
		nil,
	)

	if err != nil {
		return err
	}
	return cmd.ChangeSystemConfig(ctx, mig.currentExternalDomain, mig.currentExternalPort, mig.currentExternalSecure)
}

func (mig *externalConfigChange) String() string {
	return "config_change"
}