package core

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

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

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

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

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

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

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
}