package core

import (
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"strings"

	simple "github.com/bitly/go-simplejson"
)

type MyConfig struct {
	Env                    string `json:"env"`
	Config                 *simple.Json
	CandleDimentions       []string          `json:"candleDimentions"`
	RedisConf              *RedisConfig      `json:"redis"`
	CredentialReadOnlyConf *CredentialConfig `json:"credential"`
	CredentialMutableConf  *CredentialConfig `json:"credentialMutable"`
	ConnectConf            *ConnectConfig    `json:"connect"`
	// ThreadsConf    *ThreadsConfig    `json:"threads"`
}

type RedisConfig struct {
	Url      string `json:"url"`
	Password string `json:"password"`
	Index    int    `json:"index"`
}

type CredentialConfig struct {
	SecretKey          string `json:"secretKey"`
	BaseUrl            string `json:"baseUrl"`
	OkAccessKey        string `json:"okAccessKey"`
	OkAccessPassphrase string `json:"okAccessPassphrase"`
}

type ConnectConfig struct {
	LoginSubUrl      string `json:"loginSubUrl"`
	WsPrivateBaseUrl string `json:"wsPrivateBaseUrl"`
	WsPublicBaseUrl  string `json:"wsPublicBaseUrl"`
	RestBaseUrl      string `json:"restBaseUrl"`
}
type ThreadsConfig struct {
	MaxLenTickerStream int `json:"maxLenTickerStream"`
	MaxCandles         int `json:"maxCandles"`
	AsyncChannels      int `json:"asyncChannels"`
	MaxTickers         int `json:"maxTickers"`
	RestPeriod         int `json:"restPeriod"`
	WaitWs             int `json:"waitWs"`
}

func (cfg MyConfig) Init() (MyConfig, error) {
	env := os.Getenv("GO_ENV")
	arystr := os.Getenv("TUNAS_CANDLESDIMENTIONS")
	ary := strings.Split(arystr, "|")
	cfg.CandleDimentions = ary
	jsonStr, err := ioutil.ReadFile("/go/json/basicConfig.json")
	if err != nil {
		jsonStr, err = ioutil.ReadFile("configs/basicConfig.json")
		if err != nil {
			fmt.Println("err2:", err.Error())
			return cfg, err
		}
		cfg.Config, err = simple.NewJson([]byte(jsonStr))
		if err != nil {
			fmt.Println("err2:", err.Error())
			return cfg, err
		}
		cfg.Env = env
	}
	cfg.Config = cfg.Config.Get(env)

	ru, err := cfg.Config.Get("redis").Get("url").String()
	rp, _ := cfg.Config.Get("redis").Get("password").String()
	ri, _ := cfg.Config.Get("redis").Get("index").Int()
	redisConf := RedisConfig{
		Url:      ru,
		Password: rp,
		Index:    ri,
	}
	// fmt.Println("cfg: ", cfg)
	cfg.RedisConf = &redisConf
	ls, _ := cfg.Config.Get("connect").Get("loginSubUrl").String()
	wsPub, _ := cfg.Config.Get("connect").Get("wsPrivateBaseUrl").String()
	wsPri, _ := cfg.Config.Get("connect").Get("wsPublicBaseUrl").String()
	restBu, _ := cfg.Config.Get("connect").Get("restBaseUrl").String()
	connectConfig := ConnectConfig{
		LoginSubUrl:      ls,
		WsPublicBaseUrl:  wsPub,
		WsPrivateBaseUrl: wsPri,
		RestBaseUrl:      restBu,
	}
	cfg.ConnectConf = &connectConfig
	return cfg, nil
}

func (cfg *MyConfig) GetConfigJson(arr []string) *simple.Json {
	env := os.Getenv("GO_ENV")
	fmt.Println("env: ", env)
	cfg.Env = env

	json, err := ioutil.ReadFile("/go/json/basicConfig.json")

	if err != nil {
		json, err = ioutil.ReadFile("configs/basicConfig.json")
		if err != nil {
			log.Panic("read config error: ", err.Error())
		}
	}
	if err != nil {
		fmt.Println("read file err: ", err)
	}
	rjson, err := simple.NewJson(json)
	if err != nil {
		fmt.Println("newJson err: ", err)
	}
	for _, s := range arr {
		rjson = rjson.Get(s)
		// fmt.Println(s, ": ", rjson)
	}
	return rjson
}