package main

import (
	"encoding/json"
	"net/http"
	"os"

	"git.pyer.club/kingecg/gohttpd/admin"
	"git.pyer.club/kingecg/gohttpd/model"
	"git.pyer.club/kingecg/gohttpd/server"
	"git.pyer.club/kingecg/gohttpd/utils"
	"git.pyer.club/kingecg/gologger"
)

type GoHttp struct {
	logger gologger.Logger
}

// Start 是 GoHttp 服务的启动入口。
// 它初始化配置、日志记录器，并根据配置设置必要的服务器。
func (g *GoHttp) Start() {
	// 获取系统配置
	conf := model.GetConfig()

	// 初始化服务器的日志记录器
	g.logger = gologger.GetLogger("Server")

	// 记录 GoHttp 服务启动信息
	g.logger.Info("start gohttpd")

	// if g.conf != nil {

	// 设置管理员处理器并使用管理员服务配置
	adminHandler := server.NewServeMux(conf.Admin)
	adminHandler.Handle("/api/", http.StripPrefix("/api", admin.AdminServerMux))

	// 创建并启动管理员服务器
	g.makeServer(conf.Admin, adminHandler)

	// 遍历配置中的服务器列表，为每个服务器设置处理器并启动
	for _, s := range conf.Servers {
		// 为每个服务器创建处理器
		sHandler := server.NewServeMux(s)

		// 创建并启动该服务器
		g.makeServer(s, sHandler)
	}

	// 遍历所有已初始化的服务器，开始监听并处理传入的连接
	for _, listener := range server.ServerManager {
		// 启动服务器
		listener.Start()

		// 开始服务，处理传入请求
		listener.Serve()
	}

	// 记录 GoHttp 服务成功启动的信息
	g.logger.Info("gohttpd start success")
}

func (g *GoHttp) makeServer(conf *model.HttpServerConfig, mux http.Handler) {
	s := &http.Server{
		Handler: mux,
	}
	name := conf.Name
	port := conf.Port
	ss := &server.Server{
		Server: s,
		Conf:   conf,
	}
	server.AddServer(name, ss, port)
}

func (g *GoHttp) Stop() {}

// LoadConfig 函数用于加载配置文件并对配置中的路径进行规范化处理。
// 它读取指定的 JSON 配置文件，将其内容解析到 model.Config 结构体中，
// 然后对配置中的文件路径进行规范化处理，最后配置日志记录器。
func LoadConfig() {
	// 规范化配置文件的路径，确保路径格式统一
	cpath := utils.NormalizePath("./config.json")

	// 从指定路径读取配置文件的内容
	// 忽略可能的错误，实际应用中应处理错误
	content, _ := os.ReadFile(cpath)

	// 将读取的 JSON 内容解析到 model.Config 结构体中
	json.Unmarshal(content, &model.Config)

	// 规范化配置中日志追加器的文件路径
	// 遍历配置中的所有日志追加器
	for _, appender := range model.Config.Logging.Appenders {
		// 检查追加器类型是否为文件类型
		if appender.Type == "file" {
			// 规范化文件路径
			appender.Options["file"] = utils.NormalizePath(appender.Options["file"].(string))
		}
	}

	// 规范化管理员服务器配置中的路径
	normalizeServer(model.Config.Admin)

	// 遍历配置中的所有服务器，规范化每个服务器配置中的路径
	for _, server := range model.Config.Servers {
		normalizeServer(server)
	}

	// 根据配置中的日志设置配置日志记录器
	gologger.Configure(model.Config.Logging)

	// 获取名为 "Server" 的日志记录器实例
	logger := gologger.GetLogger("Server")

	// 记录配置加载成功的信息
	logger.Info("Load config success")
}

func normalizeServer(server *model.HttpServerConfig) {
	for index, path := range server.Paths {
		if path.Root != "" {
			server.Paths[index].Root = utils.NormalizePath(path.Root)
		}
	}
	if server.CertFile != "" {
		server.CertFile = utils.NormalizePath(server.CertFile)
	}
	if server.KeyFile != "" {
		server.KeyFile = utils.NormalizePath(server.KeyFile)
	}
}
