package utils

import (
	"encoding/json"
	"fmt"
	"strconv"

	beeLogger "github.com/beego/bee/v2/logger"
	"github.com/beego/beego/v2/server/web"
	"github.com/qiniu/qmgo"
)

var (
	RunMode          string //运行模式
	MYSQL_URL        string //数据库连接
	MYSQL_URL_EDB    string
	MYSQL_URL_GL     string
	MYSQL_URL_MASTER string
	MgoUrlData       string // mongodb数据库连接配置

	PYTHON_MYSQL_HOST           string // python数据库链接主机地址
	PYTHON_MYSQL_USER           string // python数据库链接账号
	PYTHON_MYSQL_PASSWD         string // python数据库链接密码
	PYTHON_MYSQL_DB             string // python数据库链接数据库名
	PYTHON_MONGO_HOST           string // python链接mongo主机地址
	PYTHON_MONGO_DATABASE       string // python链接mongo的库名
	PYTHON_MONGO_AUTH_MECHANISM string // python认证机制
	PYTHON_PATH                 string // python可执行文件地址

	REDIS_CACHE string //缓存地址
	//Rc          *cache.Cache //redis缓存
	Re            error        //redis错误
	Rc            RedisClient  //redis缓存
	MgoDataCli    *qmgo.Client // mongodb客户端连接
	MgoDataDbName string       // mongodb指标数据的库名
)

// DATA_INDEX_NAME 数据指标库ES索引名称
var DATA_INDEX_NAME string

// 基础配置
var (
	// APP_NAME_CN 项目中文名称
	APP_NAME_CN string

	// APP_NAME_EN 项目英文名称
	APP_NAME_EN string

	// EmailSendToUsers 邮件提醒人员
	EmailSendToUsers string

	// STATIC_DIR 文件目录
	STATIC_DIR string

	// Md5Key 签名秘钥
	Md5Key string

	// AlarmMsgUrl 报警服务地址
	AlarmMsgUrl string

	EtaBridgeUrl       string // 桥接服务地址
	EtaBridgeAppNameEn string // 桥接服务英文名称-鉴权用
	EtaBridgeMd5Key    string // 桥接服务Md5密钥-鉴权用
	EtaBridgeDesKey    string // 桥接服务Des密钥-解密数据用
)

// 第三方服务地址配置
var (
	Hz_Ths_Data_Url       string //同花顺,万得接口服务地址(本地机器地址)
	Hz_Pb_Data_Url        string //彭博接口地址
	Hz_LT_Data_Url        string //路透社接口地址
	EDB_DATA_LIMIT        = 10
	Hz_Wind_Data_Url_LIST []WindUrlMap // wind接口服务地址配置(客户本地机器,是个list列表)

	ThsDataMethod           string //同花顺数据获取的方式,app是通过终端;api是通过接口
	ThsRefreshToken         string // 同花顺的刷新token
	MysteelChemicalApiToken string // 钢联化工的api数据token
)

type WindUrlMap struct {
	Url string
	Num int
}

// ES配置
var (
	ES_URL      string // ES服务器地址
	ES_USERNAME string // ES账号
	ES_PASSWORD string // ES密码
)

// 初始化数据用户信息
var (
	BusinessCode  string //商户号
	InitAdminId   string
	InitAdminName string
)

var (
	LogPath    string
	LogFile    string
	BinLogPath string
	BinLogFile string
	ApiLogPath string
	ApiLogFile string
	LogMaxDays int //日志最大保留天数
)

var (
	UseMongo bool // 是否使用mongo
)

var (
	SmmDataMethod string // Smm有色指标数据获取方式
)

func init() {
	tmpRunMode, err := web.AppConfig.String("run_mode")
	if err != nil {
		panic("配置文件读取run_mode错误 " + err.Error())
	}
	RunMode = tmpRunMode
	fmt.Println("RunMode:", RunMode)
	if RunMode == "" {
		localIp, err := GetLocalIP()
		if localIp == "10.0.0.123" {
			RunMode = "debug"
		} else {
			RunMode = "release"
		}
		configPath := `/home/code/config/eta_index_lib/conf/app.conf`
		err = web.LoadAppConfig("ini", configPath)
		if err != nil {
			fmt.Println("web.LoadAppConfig Err:" + err.Error())
		}
	}

	config, err := web.AppConfig.GetSection(RunMode)
	if err != nil {
		panic("配置文件读取错误 " + err.Error())
	}
	beeLogger.Log.Info(RunMode + " 模式")
	MYSQL_URL = config["mysql_url"]
	MYSQL_URL_EDB = config["mysql_url_edb"]
	MYSQL_URL_GL = config["mysql_url_gl"]
	MYSQL_URL_MASTER = config["mysql_url_master"]

	// mongodb数据库连接配置
	MgoUrlData = config["mgo_url_data"]

	//python链接
	PYTHON_MYSQL_HOST = config["python_mysql_host"]
	PYTHON_MYSQL_USER = config["python_mysql_user"]
	PYTHON_MYSQL_PASSWD = config["python_mysql_passwd"]
	PYTHON_MYSQL_DB = config["python_mysql_db"]

	PYTHON_MONGO_HOST = config["python_mongo_host"]                     // python链接mongo主机地址
	PYTHON_MONGO_DATABASE = config["python_mongo_db"]                   // python链接mongo的库名
	PYTHON_MONGO_AUTH_MECHANISM = config["python_mongo_auth_mechanism"] // python链接认证机制

	PYTHON_PATH = config["python_path"]

	REDIS_CACHE = config["beego_cache"]
	if len(REDIS_CACHE) <= 0 {
		panic("redis链接参数没有配置")
	}
	//Rc, Re = cache.NewCache(REDIS_CACHE) //初始化缓存
	//if Re != nil {
	//	fmt.Println(Re)
	//	panic(Re)
	//}
	// 初始化缓存
	redisClient, err := initRedis(config["redis_type"], config["beego_cache"])
	if err != nil {
		fmt.Println("redis链接异常:", err)
		panic(any(Re))
	}

	Rc = redisClient

	// 项目中文名称
	appNameCn, err := web.AppConfig.String("app_name_cn")
	if err != nil {
		panic(any("配置文件读取app_name_cn错误 " + err.Error()))
	}
	APP_NAME_CN = appNameCn

	// 初始化内部服务配置
	{
		// 项目英文文名称
		APP_NAME_EN = config["app_name_en"]

		// 邮件提醒人员
		EmailSendToUsers = config["email_send_to_users"]

		// 静态文件目录
		STATIC_DIR = config["static_dir"]

		// 签名秘钥
		Md5Key = config["md5_key"]

		// AlarmMsgUrl 报警服务地址
		AlarmMsgUrl = config["alarm_msg_url"]

		EtaBridgeUrl = config["eta_bridge_url"]               // 桥接服务地址
		EtaBridgeAppNameEn = config["eta_bridge_app_name_en"] // 桥接服务英文名称-鉴权用
		EtaBridgeMd5Key = config["eta_bridge_md5_key"]        // 桥接服务Md5密钥-鉴权用
		EtaBridgeDesKey = config["eta_bridge_des_key"]        // 桥接服务Des密钥-解密数据用
	}

	// 第三方服务地址配置
	{
		Hz_Ths_Data_Url = config["hz_ths_data_url"]
		Hz_Pb_Data_Url = config["hz_pb_data_url"] //彭博接口地址
		Hz_LT_Data_Url = config["hz_lt_data_url"] //路透社接口地址

		// wind服务地址配置(多组服务器配置)
		windUrlListStr := config["hz_wind_data_url_list"]
		if windUrlListStr != `` {
			windUrlList := make([]WindUrlMap, 0)
			err = json.Unmarshal([]byte(windUrlListStr), &windUrlList)
			if err != nil {
				panic(any("配置文件读取hz_wind_data_url_list错误 " + err.Error()))
			}
			Hz_Wind_Data_Url_LIST = windUrlList
		}

		ThsRefreshToken = config["ths_refresh_token"] //同花顺的刷新token
		ThsDataMethod = config["ths_data_method"]     // 同花顺数据获取的方式
		// 默认走api接口
		if ThsDataMethod == `` {
			ThsDataMethod = "api"
		}
		MysteelChemicalApiToken = config["mysteel_chemical_api_token"]
	}

	// ES配置
	{
		ES_URL = config["es_url"]
		ES_USERNAME = config["es_username"]
		ES_PASSWORD = config["es_password"]
		DATA_INDEX_NAME = config["data_index_name"]
	}

	//日志配置
	{
		LogPath = config["log_path"]
		LogFile = config["log_file"]
		BinLogPath = config["binlog_path"]
		BinLogFile = config["binlog_file"]
		ApiLogPath = config["apilog_path"]
		ApiLogFile = config["apilog_file"]
		logMaxDaysStr := config["log_max_day"]
		LogMaxDays, _ = strconv.Atoi(logMaxDaysStr)
	}

	// 数据指标库ES索引名称
	InitAdminId = config["init_admin_id"]

	//初始化数据用户配置
	InitAdminName = config["init_admin_name"]

	// 初始化商家编码
	BusinessCode = config["business_code"]

	// 初始化ES
	initEs()
}

//修改接口文档
//http://8.136.199.33:8300/swagger/