/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package runtime

import (
	"context"
	"fmt"
	"os"
	"sync"
	"time"
)

import (
	"dubbo.apache.org/dubbo-go/v3/config_center"
	"dubbo.apache.org/dubbo-go/v3/metadata/report"
	dubboRegistry "dubbo.apache.org/dubbo-go/v3/registry"

	"github.com/pkg/errors"
)

import (
	dubbo_cp "github.com/apache/dubbo-kubernetes/pkg/config/app/dubbo-cp"
	"github.com/apache/dubbo-kubernetes/pkg/core"
	"github.com/apache/dubbo-kubernetes/pkg/core/admin"
	config_manager "github.com/apache/dubbo-kubernetes/pkg/core/config/manager"
	"github.com/apache/dubbo-kubernetes/pkg/core/datasource"
	"github.com/apache/dubbo-kubernetes/pkg/core/dns/lookup"
	"github.com/apache/dubbo-kubernetes/pkg/core/governance"
	"github.com/apache/dubbo-kubernetes/pkg/core/reg_client"
	"github.com/apache/dubbo-kubernetes/pkg/core/registry"
	core_manager "github.com/apache/dubbo-kubernetes/pkg/core/resources/manager"
	core_store "github.com/apache/dubbo-kubernetes/pkg/core/resources/store"
	"github.com/apache/dubbo-kubernetes/pkg/core/runtime/component"
	dds_context "github.com/apache/dubbo-kubernetes/pkg/dds/context"
	dp_server "github.com/apache/dubbo-kubernetes/pkg/dp-server/server"
	"github.com/apache/dubbo-kubernetes/pkg/events"
	"github.com/apache/dubbo-kubernetes/pkg/intercp/client"
	"github.com/apache/dubbo-kubernetes/pkg/xds/cache/mesh"
)

// BuilderContext provides access to Builder's interim state.
type BuilderContext interface {
	ComponentManager() component.Manager
	ResourceStore() core_store.CustomizableResourceStore
	Transactions() core_store.Transactions
	ConfigStore() core_store.ResourceStore
	ResourceManager() core_manager.CustomizableResourceManager
	Config() dubbo_cp.Config
	RegistryCenter() dubboRegistry.Registry
	RegClient() reg_client.RegClient
	MetadataReportCenter() report.MetadataReport
	AdminRegistry() *registry.Registry
	ServiceDiscovery() dubboRegistry.ServiceDiscovery
	ConfigCenter() config_center.DynamicConfiguration
	Governance() governance.GovernanceConfig
	Extensions() context.Context
	ConfigManager() config_manager.ConfigManager
	LeaderInfo() component.LeaderInfo
	EventBus() events.EventBus
	DpServer() *dp_server.DpServer
	DataplaneCache() *sync.Map
	InterCPClientPool() *client.Pool
	DDSContext() *dds_context.Context
	ResourceValidators() ResourceValidators
}

var _ BuilderContext = &Builder{}

// Builder represents a multi-step initialization process.
type Builder struct {
	cfg                  dubbo_cp.Config
	cm                   component.Manager
	rs                   core_store.CustomizableResourceStore
	cs                   core_store.ResourceStore
	txs                  core_store.Transactions
	rm                   core_manager.CustomizableResourceManager
	rom                  core_manager.ReadOnlyResourceManager
	eac                  admin.EnvoyAdminClient
	ext                  context.Context
	meshCache            *mesh.Cache
	lif                  lookup.LookupIPFunc
	configm              config_manager.ConfigManager
	leadInfo             component.LeaderInfo
	erf                  events.EventBus
	dsl                  datasource.Loader
	interCpPool          *client.Pool
	dps                  *dp_server.DpServer
	registryCenter       dubboRegistry.Registry
	metadataReportCenter report.MetadataReport
	configCenter         config_center.DynamicConfiguration
	adminRegistry        *registry.Registry
	governance           governance.GovernanceConfig
	rv                   ResourceValidators
	ddsctx               *dds_context.Context
	appCtx               context.Context
	dCache               *sync.Map
	regClient            reg_client.RegClient
	serviceDiscover      dubboRegistry.ServiceDiscovery
	*runtimeInfo
}

func BuilderFor(appCtx context.Context, cfg dubbo_cp.Config) (*Builder, error) {
	hostname, err := os.Hostname()
	if err != nil {
		return nil, errors.Wrap(err, "could not get hostname")
	}
	suffix := core.NewUUID()[0:4]
	return &Builder{
		cfg: cfg,
		ext: context.Background(),
		runtimeInfo: &runtimeInfo{
			instanceId: fmt.Sprintf("%s-%s", hostname, suffix),
			startTime:  time.Now(),
			mode:       cfg.Mode,
			deployMode: cfg.DeployMode,
		},
		appCtx: appCtx,
	}, nil
}

func (b *Builder) WithComponentManager(cm component.Manager) *Builder {
	b.cm = cm
	return b
}

func (b *Builder) WithResourceStore(rs core_store.CustomizableResourceStore) *Builder {
	b.rs = rs
	return b
}

func (b *Builder) WithTransactions(txs core_store.Transactions) *Builder {
	b.txs = txs
	return b
}

func (b *Builder) WithConfigStore(cs core_store.ResourceStore) *Builder {
	b.cs = cs
	return b
}

func (b *Builder) WithResourceManager(rm core_manager.CustomizableResourceManager) *Builder {
	b.rm = rm
	return b
}

func (b *Builder) WithReadOnlyResourceManager(rom core_manager.ReadOnlyResourceManager) *Builder {
	b.rom = rom
	return b
}

func (b *Builder) WithExtensions(ext context.Context) *Builder {
	b.ext = ext
	return b
}

func (b *Builder) WithExtension(key interface{}, value interface{}) *Builder {
	b.ext = context.WithValue(b.ext, key, value)
	return b
}

func (b *Builder) WithConfigManager(configm config_manager.ConfigManager) *Builder {
	b.configm = configm
	return b
}

func (b *Builder) WithLeaderInfo(leadInfo component.LeaderInfo) *Builder {
	b.leadInfo = leadInfo
	return b
}

func (b *Builder) WithDataplaneCache(cache *sync.Map) *Builder {
	b.dCache = cache
	return b
}

func (b *Builder) WithLookupIP(lif lookup.LookupIPFunc) *Builder {
	b.lif = lif
	return b
}

func (b *Builder) WithMeshCache(meshCache *mesh.Cache) *Builder {
	b.meshCache = meshCache
	return b
}

func (b *Builder) WithEventBus(erf events.EventBus) *Builder {
	b.erf = erf
	return b
}

func (b *Builder) WithDataSourceLoader(loader datasource.Loader) *Builder {
	b.dsl = loader
	return b
}

func (b *Builder) WithDpServer(dps *dp_server.DpServer) *Builder {
	b.dps = dps
	return b
}

func (b *Builder) WithEnvoyAdminClient(eac admin.EnvoyAdminClient) *Builder {
	b.eac = eac
	return b
}

func (b *Builder) WithDDSContext(ddsctx *dds_context.Context) *Builder {
	b.ddsctx = ddsctx
	return b
}

func (b *Builder) WithResourceValidators(rv ResourceValidators) *Builder {
	b.rv = rv
	return b
}

func (b *Builder) WithRegClient(regClient reg_client.RegClient) *Builder {
	b.regClient = regClient
	return b
}

func (b *Builder) WithRegistryCenter(rg dubboRegistry.Registry) *Builder {
	b.registryCenter = rg
	return b
}

func (b *Builder) WithGovernanceConfig(gc governance.GovernanceConfig) *Builder {
	b.governance = gc
	return b
}

func (b *Builder) WithMetadataReport(mr report.MetadataReport) *Builder {
	b.metadataReportCenter = mr
	return b
}

func (b *Builder) WithConfigCenter(cc config_center.DynamicConfiguration) *Builder {
	b.configCenter = cc
	return b
}

func (b *Builder) WithAdminRegistry(ag *registry.Registry) *Builder {
	b.adminRegistry = ag
	return b
}

func (b *Builder) WithServiceDiscovery(discovery dubboRegistry.ServiceDiscovery) *Builder {
	b.serviceDiscover = discovery
	return b
}

func (b *Builder) Build() (Runtime, error) {
	if b.cm == nil {
		return nil, errors.Errorf("ComponentManager has not been configured")
	}
	if b.rs == nil {
		return nil, errors.Errorf("ResourceStore has not been configured")
	}
	if b.txs == nil {
		return nil, errors.Errorf("Transactions has not been configured")
	}
	if b.rm == nil {
		return nil, errors.Errorf("ResourceManager has not been configured")
	}
	if b.rom == nil {
		return nil, errors.Errorf("ReadOnlyResourceManager has not been configured")
	}
	if b.ext == nil {
		return nil, errors.Errorf("Extensions have been misconfigured")
	}
	if b.leadInfo == nil {
		return nil, errors.Errorf("LeaderInfo has not been configured")
	}
	if b.erf == nil {
		return nil, errors.Errorf("EventReaderFactory has not been configured")
	}
	if b.dps == nil {
		return nil, errors.Errorf("DpServer has not been configured")
	}

	return &runtime{
		RuntimeInfo: b.runtimeInfo,
		RuntimeContext: &runtimeContext{
			cfg:                  b.cfg,
			rm:                   b.rm,
			rom:                  b.rom,
			txs:                  b.txs,
			ddsctx:               b.ddsctx,
			ext:                  b.ext,
			configm:              b.configm,
			registryCenter:       b.registryCenter,
			metadataReportCenter: b.metadataReportCenter,
			configCenter:         b.configCenter,
			adminRegistry:        b.adminRegistry,
			governance:           b.governance,
			leadInfo:             b.leadInfo,
			erf:                  b.erf,
			dCache:               b.dCache,
			dps:                  b.dps,
			eac:                  b.eac,
			serviceDiscovery:     b.serviceDiscover,
			rv:                   b.rv,
			appCtx:               b.appCtx,
			regClient:            b.regClient,
		},
		Manager: b.cm,
	}, nil
}

func (b *Builder) RegClient() reg_client.RegClient {
	return b.regClient
}

func (b *Builder) DataplaneCache() *sync.Map {
	return b.dCache
}

func (b *Builder) Governance() governance.GovernanceConfig {
	return b.governance
}

func (b *Builder) AdminRegistry() *registry.Registry {
	return b.adminRegistry
}

func (b *Builder) ConfigCenter() config_center.DynamicConfiguration {
	return b.configCenter
}

func (b *Builder) ServiceDiscovery() dubboRegistry.ServiceDiscovery {
	return b.serviceDiscover
}

func (b *Builder) RegistryCenter() dubboRegistry.Registry {
	return b.registryCenter
}

func (b *Builder) MetadataReportCenter() report.MetadataReport {
	return b.metadataReportCenter
}

func (b *Builder) ComponentManager() component.Manager {
	return b.cm
}

func (b *Builder) ResourceStore() core_store.CustomizableResourceStore {
	return b.rs
}

func (b *Builder) Transactions() core_store.Transactions {
	return b.txs
}

func (b *Builder) ConfigStore() core_store.ResourceStore {
	return b.cs
}

func (b *Builder) ResourceManager() core_manager.CustomizableResourceManager {
	return b.rm
}

func (b *Builder) ReadOnlyResourceManager() core_manager.ReadOnlyResourceManager {
	return b.rom
}

func (b *Builder) InterCPClientPool() *client.Pool {
	return b.interCpPool
}

func (b *Builder) LookupIP() lookup.LookupIPFunc {
	return b.lif
}

func (b *Builder) Config() dubbo_cp.Config {
	return b.cfg
}

func (b *Builder) DDSContext() *dds_context.Context {
	return b.ddsctx
}

func (b *Builder) Extensions() context.Context {
	return b.ext
}

func (b *Builder) ConfigManager() config_manager.ConfigManager {
	return b.configm
}

func (b *Builder) LeaderInfo() component.LeaderInfo {
	return b.leadInfo
}

func (b *Builder) EventBus() events.EventBus {
	return b.erf
}

func (b *Builder) DpServer() *dp_server.DpServer {
	return b.dps
}

func (b *Builder) ResourceValidators() ResourceValidators {
	return b.rv
}

func (b *Builder) AppCtx() context.Context {
	return b.appCtx
}
