package config

import (
	"errors"
	"os"
	"strconv"

	"github.com/joho/godotenv"
)

type Config struct {
	Port               int
	MetaTemplate       string
	ClashTemplate      string
	RequestRetryTimes  int
	RequestMaxFileSize int64
	CacheExpire        int64
	LogLevel           string
	//BasePath           string
	ShortLinkLength int
}

var Default *Config
var Dev string

func LoadConfig() error {
	Default = &Config{
		MetaTemplate:       "template_meta.yaml",
		ClashTemplate:      "template_clash.yaml",
		RequestRetryTimes:  3,
		RequestMaxFileSize: 1024 * 1024 * 1,
		Port:               8011,
		CacheExpire:        60 * 5,
		LogLevel:           "info",
		//BasePath:           "/",
		ShortLinkLength: 6,
	}
	_ = godotenv.Load()
	if os.Getenv("PORT") != "" {
		atoi, err := strconv.Atoi(os.Getenv("PORT"))
		if err != nil {
			return errors.New("PORT invalid")
		}
		Default.Port = atoi
	}
	if os.Getenv("META_TEMPLATE") != "" {
		Default.MetaTemplate = os.Getenv("META_TEMPLATE")
	}
	if os.Getenv("CLASH_TEMPLATE") != "" {
		Default.ClashTemplate = os.Getenv("CLASH_TEMPLATE")
	}
	if os.Getenv("REQUEST_RETRY_TIMES") != "" {
		atoi, err := strconv.Atoi(os.Getenv("REQUEST_RETRY_TIMES"))
		if err != nil {
			return errors.New("REQUEST_RETRY_TIMES invalid")
		}
		Default.RequestRetryTimes = atoi
	}
	if os.Getenv("REQUEST_MAX_FILE_SIZE") != "" {
		atoi, err := strconv.Atoi(os.Getenv("REQUEST_MAX_FILE_SIZE"))
		if err != nil {
			return errors.New("REQUEST_MAX_FILE_SIZE invalid")
		}
		Default.RequestMaxFileSize = int64(atoi)
	}
	if os.Getenv("CACHE_EXPIRE") != "" {
		atoi, err := strconv.Atoi(os.Getenv("CACHE_EXPIRE"))
		if err != nil {
			return errors.New("CACHE_EXPIRE invalid")
		}
		Default.CacheExpire = int64(atoi)
	}
	if os.Getenv("LOG_LEVEL") != "" {
		Default.LogLevel = os.Getenv("LOG_LEVEL")
	}
	//if os.Getenv("BASE_PATH") != "" {
	//	Default.BasePath = os.Getenv("BASE_PATH")
	//	if Default.BasePath[len(Default.BasePath)-1] != '/' {
	//		Default.BasePath += "/"
	//	}
	//}
	if os.Getenv("SHORT_LINK_LENGTH") != "" {
		atoi, err := strconv.Atoi(os.Getenv("SHORT_LINK_LENGTH"))
		if err != nil {
			return errors.New("SHORT_LINK_LENGTH invalid")
		}
		Default.ShortLinkLength = atoi
	}
	return nil
}