package conf

import (
	"fmt"
	"os"

	"box-cost/log"

	"github.com/spf13/viper"
)

const (
	SaveType_Obs   = "obs"
	SaveType_OSS   = "oss"
	SaveType_Minio = "minio"
)

type AppConf struct {
	Name       string
	Version    string
	SaveType   string //obs, oss, minio
	PdfApiAddr string

	Jwt struct {
		Realm       string
		Key         string
		TimeoutHour int
	}

	Redis struct {
		Addr     string
		Password string // no password set
		Db       int    // use default DB
	}
	Log struct {
		FileName    string
		Level       int32
		ServiceName string
	}
	Port  int32
	Mongo struct {
		DSN      string
		Database string
	}

	Debug struct {
		UserId    string
		UserPhone string
		UserRole  string
	}

	Nats struct {
		Url               string
		MaxReconnect      int
		ReconnDelaySecond int
	}

	Obs struct {
		Bucket      string
		AccessKeyId string
		SecrateKey  string
		Endpoint    string
	}

	Auth struct {
		Endpoint     string
		ClientId     string
		ClientSecret string

		Certificate      string
		OrganizationName string
		ApplicationName  string
	}
}

func LoadConfFile(filepath string) (*AppConf, error) {
	file, err := os.Open(filepath)
	if err != nil {
		log.Errorf("can not open file:%s", filepath)
		return nil, err
	}
	v := viper.New()
	v.SetConfigType("yaml")
	err = v.ReadConfig(file)
	if err != nil {
		return nil, err
	}
	c := new(AppConf)
	err = v.Unmarshal(c)
	return c, err
}

func NewAppConf(filePath string) (*AppConf, error) {

	c, err := LoadConfFile(filePath)
	if err != nil {
		return c, err
	}

	//初始化log
	_ = log.NewLoggerSugar(c.Log.ServiceName, c.Log.FileName, c.Log.Level)

	natsHost := os.Getenv("NATS")
	if len(natsHost) > 0 {
		c.Nats.Url = natsHost
	}
	pdfApiAddr := os.Getenv("TOPDF_ADDR")
	if len(pdfApiAddr) > 0 {
		c.PdfApiAddr = pdfApiAddr
	}
	fmt.Println("pdf_config=>", c.PdfApiAddr)
	fmt.Println("pdf_env=>", pdfApiAddr)
	AppConfig = c
	return c, nil
}

var AppConfig *AppConf = nil