package baize

import (
	"git.sxidc.com/go-framework/baize/framework/core/api"
	"git.sxidc.com/go-framework/baize/framework/core/application"
	"git.sxidc.com/go-framework/baize/framework/core/infrastructure"
	"git.sxidc.com/go-framework/baize/framework/core/mqtt_api"
)

func NewApplication(conf application.Config) *application.App {
	// 创建API
	apiConfig := conf.ApiConfig
	apiInstance := api.New(api.WithUrlPrefix(apiConfig.UrlPrefix),
		api.WithPort(apiConfig.Port),
		api.WithLogSkipPaths(apiConfig.LogSkipPaths...))

	// 创建基础设施
	infrastructureConfig := new(infrastructure.Config)
	infrastructureConfig.DatabaseConfig = conf.InfrastructureConfig.Database
	infrastructureConfig.CacheConfig = conf.InfrastructureConfig.Cache

	infrastructureInstance := infrastructure.NewInfrastructure(*infrastructureConfig)

	app := application.New(apiInstance, infrastructureInstance)

	// 添加MqttApi
	if conf.MqttApiConfig != nil {
		mqttConfig := conf.MqttApiConfig
		mqttApi, err := mqtt_api.New(mqtt_api.WithTopicPrefix(mqttConfig.TopicPrefix),
			mqtt_api.WithLogSkipPaths(mqttConfig.LogSkipPaths...),
			mqtt_api.WithMqttOptions(&mqtt_api.MqttClientOptions{
				UserName:        mqttConfig.MqttConfig.UserName,
				Password:        mqttConfig.MqttConfig.Password,
				Address:         mqttConfig.MqttConfig.Address,
				ClientID:        mqttConfig.MqttConfig.ClientID,
				KeepAliveSec:    mqttConfig.MqttConfig.KeepAliveSec,
				PingTimeoutSec:  mqttConfig.MqttConfig.PingTimeoutSec,
				WriteTimeoutSec: mqttConfig.MqttConfig.WriteTimeoutSec,
			}))
		if err != nil {
			panic(err)
		}

		app.AddMqttApi(mqttApi)
	}

	return app
}

func DestroyApplication(app *application.App) {
	if app == nil {
		return
	}

	mqttApi := app.MqttApi()
	if mqttApi != nil {
		mqtt_api.Destroy(mqttApi)
	}

	infrastructure.DestroyInfrastructure(app.Infrastructure())
}