package config

import (
	"context"
	"fmt"
	"io"
	"os"

	"github.com/creasty/defaults"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	"gopkg.in/yaml.v3"
)

const (
	defaultTimeout = 10 // default timeout 10 s
)

var globalConf = &WrapperConfig{}

func Config() *WrapperConfig {
	return globalConf
}

func InitConfig(path string) error {
	config, err := ParseConfigFromFile(path)
	if err != nil {
		return fmt.Errorf("failed to parse config: %w", err)
	}
	globalConf = config
	tilog.Info(context.Background(), "init config success")
	return nil
}

// ParseConfigFromFile parse configs from a file path
func ParseConfigFromFile(path string) (*WrapperConfig, error) {
	file, err := os.Open(path)
	if err != nil {
		return nil, fmt.Errorf("failed to open: %w", err)
	}
	defer file.Close()
	content, err := io.ReadAll(file)
	if err != nil {
		return nil, fmt.Errorf("failed to read: %w", err)
	}
	return ParseConfig(content)
}

// ParseConfig parse configs from bytes
func ParseConfig(content []byte) (*WrapperConfig, error) {
	var config WrapperConfig
	err := defaults.Set(&config)
	if err != nil {
		return nil, fmt.Errorf("failed to set defaults: %w", err)
	}
	err = yaml.Unmarshal(content, &config)
	if err != nil {
		return nil, fmt.Errorf("failed to unmarshal: %w", err)
	}

	// check grpc timeout
	if config.Grpc.Timeout == 0 {
		config.Grpc.Timeout = defaultTimeout
	}

	return &config, nil
}
