package bootstrap

import (
	conf2 "github.com/alist-org/alist/v3/internal/conf"
	"io/ioutil"
	"os"
	"path/filepath"

	"github.com/alist-org/alist/v3/cmd/args"
	"github.com/alist-org/alist/v3/pkg/utils"
	"github.com/caarlos0/env/v6"
	log "github.com/sirupsen/logrus"
)

func InitConfig() {
	log.Infof("reading config file: %s", args.Config)
	if !utils.Exists(args.Config) {
		log.Infof("config file not exists, creating default config file")
		_, err := utils.CreateNestedFile(args.Config)
		if err != nil {
			log.Fatalf("failed to create config file: %+v", err)
		}
		conf2.Conf = conf2.DefaultConfig()
		if !utils.WriteToJson(args.Config, conf2.Conf) {
			log.Fatalf("failed to create default config file")
		}
	} else {
		configBytes, err := ioutil.ReadFile(args.Config)
		if err != nil {
			log.Fatalf("reading config file error:%s", err.Error())
		}
		conf2.Conf = conf2.DefaultConfig()
		err = utils.Json.Unmarshal(configBytes, conf2.Conf)
		if err != nil {
			log.Fatalf("load config error: %s", err.Error())
		}
		log.Debugf("config:%+v", conf2.Conf)
		// update config.json struct
		confBody, err := utils.Json.MarshalIndent(conf2.Conf, "", "  ")
		if err != nil {
			log.Fatalf("marshal config error:%s", err.Error())
		}
		err = ioutil.WriteFile(args.Config, confBody, 0777)
		if err != nil {
			log.Fatalf("update config struct error: %s", err.Error())
		}
	}
	if !conf2.Conf.Force {
		confFromEnv()
	}
	// convert abs path
	var absPath string
	var err error
	if !filepath.IsAbs(conf2.Conf.TempDir) {
		absPath, err = filepath.Abs(conf2.Conf.TempDir)
		if err != nil {
			log.Fatalf("get abs path error: %s", err.Error())
		}
	}
	conf2.Conf.TempDir = absPath
	err = os.RemoveAll(filepath.Join(conf2.Conf.TempDir))
	if err != nil {
		log.Errorln("failed delete temp file:", err)
	}
	err = os.MkdirAll(conf2.Conf.TempDir, 0700)
	if err != nil {
		log.Fatalf("create temp dir error: %s", err.Error())
	}
	log.Debugf("config: %+v", conf2.Conf)
}

func confFromEnv() {
	prefix := "ALIST_"
	if args.NoPrefix {
		prefix = ""
	}
	log.Infof("load config from env with prefix: %s", prefix)
	if err := env.Parse(conf2.Conf, env.Options{
		Prefix: prefix,
	}); err != nil {
		log.Fatalf("load config from env error: %s", err.Error())
	}
}