/**
 * CMS内容管理系统主入口
 * @Author: david.yan(david.yan@qq.com)
 * @Date: 2021-11-26 15:25:03
 * @Description: 提供文章、页面、分类、标签等内容管理功能
 */
package main

import (
	"bsm/full/module/base/cms/internal/config"
	"bsm/full/module/base/cms/internal/impl"
	"bsm/full/module/base/cms/internal/server"
	"git.apinb.com/bsm-sdk/core/service"
)

var (
	// ServiceKey 服务标识符，用于配置加载和服务注册
	ServiceKey = "cms"
)

// main 应用程序主入口函数
// 负责初始化配置、数据库连接、gRPC服务等核心组件
func Run() {
	// 初始化配置，加载服务配置参数
	config.New(ServiceKey)

	// 初始化实现层，建立数据库、缓存、etcd等连接
	impl.NewImpl()

	// 创建gRPC服务器实例，监听指定地址
	s := server.New(nil)

	// 创建微服务实例，配置服务参数
	srv := service.New(
		s.Grpc,
		&service.Options{
			Addr:        config.Spec.Addr,         // 服务监听地址
			MsConf:      config.Spec.MicroService, // 微服务配置
			EtcdClient:  impl.EtcdService,         // Etcd客户端，用于服务发现
			GatewayCtx:  s.Ctx,                    // HTTP网关上下文
			GatewayConf: config.Spec.Gateway,      // HTTP网关配置
			GatewayMux:  s.Mux,                    // HTTP网关多路复用器
		},
	)

	// 程序退出时优雅地停止服务，释放资源
	defer srv.Stop()

	// 启动服务，开始监听和处理请求
	srv.Start()
}

func main() {
	Run()
}
