package utils

import (
	"errors"
	"fmt"
	"strconv"

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

var (
	RunMode          string //运行模式
	MYSQL_URL        string //数据库连接
	MYSQL_URL_RDDP   string //数据库连接
	MYSQL_URL_EDB    string
	MYSQL_URL_DATA   string
	MYSQL_URL_GL     string
	MYSQL_LOG_URL    string
	MYSQL_WEEKLY_URL string //用户主库
	MYSQL_AI_URL     string //ETA-AI 数据库
	MgoUrlData       string // mongodb数据库连接配置

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

// binlog
var (
	MYSQL_DATA_BINLOG_URL       string // 数据指标库binlog地址
	MYSQL_DATA_BINLOG_USER      string // 数据指标库binlog用户名
	MYSQL_DATA_BINLOG_PWD       string // 数据指标库binlog密码
	MYSQL_DATA_BINLOG_DB        string // 数据指标库binlog位置
	MYSQL_DATA_BINLOG_SERVER_ID string // 数据指标库binlog server_id
)

// 基础配置
var (
	STATIC_DIR       string
	DesKey           string // 接口返回加密KEY
	APPNAME          string //项目中文名称
	EmailSendToUsers string // 邮件提醒人员
	JhGnAppKey       string // 聚合短信,国内AppKey
	JhGjAppKey       string // 聚合短信,国际AppKey
	ResourceProxyUrl string // 代理资源地址
	RESOURCE_DIR     string
)

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

// 公共api内部服务调用
var (
	// EDB_LIB_URL 公共指标库
	EDB_LIB_URL         string
	APP_EDB_LIB_NAME_EN string
	EDB_LIB_Md5_KEY     string

	// PublicChartHost 公共图库的host
	PublicChartHost string

	// MySteelPostUrl 钢联化工的服务地址
	MySteelPostUrl string

	// SendWxTemplateMsgUrl 模板消息推送
	SendWxTemplateMsgUrl string

	// SendTemplateMsgAuthorization 模板推送秘钥
	SendTemplateMsgAuthorization string

	// HandleVideoDecibelUrl 处理音频分贝的url
	HandleVideoDecibelUrl string

	// Ppt2ImageUrl ppt转图片服务的地址
	Ppt2ImageUrl string

	// HongzeOpenApiHost 开放openapi的地址
	HongzeOpenApiHost string

	// EnglishShareUrl 英文研报群发邮件分享地址
	EnglishShareUrl string

	// EnPolicyReportUrl 英文策略报告
	EnPolicyReportUrl string

	// GoogleTranslateUrl 谷歌翻译服务
	GoogleTranslateUrl string

	// AlarmMsgUrl 报警服务地址
	AlarmMsgUrl string

	// ChatUrl chatGPT服务地址
	ChatUrl string

	EtaBridgeUrl       string // 桥接服务地址
	EtaBridgeAppNameEn string // 桥接服务英文名称-鉴权用
	EtaBridgeMd5Key    string // 桥接服务Md5密钥-鉴权用
	EtaBridgeDesKey    string // 桥接服务Des密钥-解密数据用
	EtaBridgeLoginUrl  string // 第三方登录鉴权接口地址
	EtaBridgeLogoutUrl string // 第三方登出接口地址

	ETAMiniBridgeUrl    string // 桥接服务地址
	ETA_MINI_APPID      string // 桥接服务-鉴权用
	ETA_MINI_APP_SECRET string // 桥接服务-鉴权用
)

// 微信配置信息
var (
	WxId                string //微信原始ID
	WxAppId             string // 公众号appid
	WxAppSecret         string // 公众号秘钥
	TemplateIdByProduct string //产品运行报告通知-模板ID

	WxYbAppId     string // 研报小程序appid
	WxYbId        string // 研报小程序微信原始ID
	WxYbAppSecret string // 研报小程序秘钥
	WxYbPlatform  int    //弘则研报来源
)

// ES索引配置
var (
	DATA_INDEX_NAME                string //数据指标库索引
	CHART_INDEX_NAME               string //研究图库索引
	EsReportIndexName              string //研报ES索引
	EsEnglishReportIndexName       string //英文研报ES索引
	MY_CHART_INDEX_NAME            string //研究图库(MY ETA)索引
	EsSemanticAnalysisDocIndexName string //ES语义分析文档索引名
	SmartReportIndexName           string //智能研报ES索引
)

var (
	XfHostUrl string // 科大讯飞--语音合成
)

// 对象存储客户端
var (
	ObjectStorageClient string // 目前有oss minio,默认oss
	PptUpdateApi        string //ppt 通过后端接口的方式上传
)

// 阿里云配置
var (
	Bucketname       string
	Endpoint         string
	Imghost          string
	UploadDir        string
	Upload_Audio_Dir string
	AccessKeyId      string
	AccessKeySecret  string
)

// 阿里云oss前端上传用
var (
	AliStsScheme       string
	RegionId           string
	RoleArn            string
	RoleSessionName    string
	RAMAccessKeyId     string
	RAMAccessKeySecret string
	STSTokenCacheKey   string
)

// 阿里云邮箱配置
var (
	AliyunEmailAccountName       string
	AliyunEmailAccessKeyId       string
	AliyunEmailAccessKeySecret   string
	AliyunEmailReplyAddress      string
	AliyunEmailReplyAddressAlias string
)

// 腾讯云邮箱配置
var (
	TencentSDKSecretId  string // 腾讯云主账号SecretId
	TencentSDKSecretKey string // 腾讯云主账号SecretKey

	TencentEmailFromEmailAddress string // 腾讯云邮件发信地址
	TencentEmailTemplateID       uint64 // 云邮件模板ID
)

// LibreOfficePath LibreOfficePath的地址
var LibreOfficePath string

// CrmEtaServerUrl CRM-ETA服务地址
var (
	CrmEtaServerUrl     string
	CrmEtaServerDes3Key string
)

// eta_forum_hub ETA社区桥接服务地址
var (
	ETA_FORUM_HUB_URL     string
	ETA_FORUM_HUB_NAME_EN string
	ETA_FORUM_HUB_MD5_KEY string
)

// BusinessCode 商家编码
var BusinessCode string

// 日志配置
var (
	LogPath     string //调用过程中的日志存放地址
	LogFile     string
	LogDataPath string //调用过程中图表相关的日志存放地址
	LogDataFile string
	BinLogPath  string //数据库相关的日志存放地址
	BinLogFile  string
	ApiLogPath  string //接口请求地址和接口返回值日志存放地址
	ApiLogFile  string
	LogMaxDays  int //日志最大保留天数
)

// MinIo配置
var (
	MinIoBucketname       string
	MinIoEndpoint         string
	MinIoBackEndpoint     string
	MinIoImghost          string
	MinIoUploadDir        string
	MinIoUpload_Audio_Dir string
	MinIoAccessKeyId      string
	MinIoAccessKeySecret  string
	MinIoUseSSL           string
	MinIoPort             string
	MinIoRegion           string
	MinIoFileDownloadHost string
)

// PythonUrlReport2Img 生成长图服务地址
var PythonUrlReport2Img string

// ETA-AI服务
var EtaAiUrl string

var (
	EtaAppid  string
	EtaSecret string
)

// S3配置
var (
	S3Endpoint        string
	S3BackEndpoint    string
	S3BucketName      string
	S3UploadDir       string
	S3AccessKeyId     string
	S3AccessKeySecret string
	S3Host            string
	S3Region          string
	S3ForceStyle      string
	S3EndpointPort    string
	S3Protocol        string
	S3DisableSSL      string
	S3OpenAcl         string
)

// chrome配置
var (
	ChromePath string // chrome浏览器地址
)

var (
	ErrMsgConfigFile string
)

var (
	ViperConfig *viper.Viper
)

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

func init() {
	tmpRunMode, err := web.AppConfig.String("run_mode")
	if err != nil {
		panic(any("配置文件读取run_mode错误 " + err.Error()))
	}
	RunMode = tmpRunMode
	fmt.Println("RunMode:", RunMode)
	if RunMode == "" {
		localIp, err := GetLocalIP()
		fmt.Println("localIp:", localIp)
		if localIp == "10.0.0.123" {
			RunMode = "debug"
		} else {
			RunMode = "release"
		}
		fmt.Println("RunMode:", RunMode)
		configPath := `/home/code/config/eta_api/conf/app.conf`
		fmt.Println("configPath:", configPath)
		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(any("配置文件读取错误 " + err.Error()))
	}
	beeLogger.Log.Info(RunMode + " 模式")
	MYSQL_URL = config["mysql_url"]
	MYSQL_URL_RDDP = config["mysql_url_rddp"]
	MYSQL_URL_EDB = config["mysql_url_edb"]
	MYSQL_URL_DATA = config["mysql_url_data"]
	MYSQL_URL_GL = config["mysql_url_gl"]
	MYSQL_LOG_URL = config["mysql_url_log"]

	// 用户主库
	MYSQL_WEEKLY_URL = config["mysql_url_weekly"]

	// 用户主库
	MYSQL_WEEKLY_URL = config["mysql_url_weekly"]
	//ETA-AI
	MYSQL_AI_URL = config["mysql_url_ai"]

	// binlog配置
	{
		MYSQL_DATA_BINLOG_URL = config["mysql_data_binlog_url"]
		MYSQL_DATA_BINLOG_USER = config["mysql_data_binlog_user"]
		MYSQL_DATA_BINLOG_PWD = config["mysql_data_binlog_pwd"]
		MYSQL_DATA_BINLOG_DB = config["mysql_data_binlog_db"]
		MYSQL_DATA_BINLOG_SERVER_ID = config["mysql_data_binlog_server_id"]
	}

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

	REDIS_CACHE = config["beego_cache"]
	if len(REDIS_CACHE) <= 0 {
		panic(any("redis链接参数没有配置"))
	}
	//Rc, Re = cache.NewCache(REDIS_CACHE) //初始化缓存
	//if Re != nil {
	//	fmt.Println("redis链接异常:", Re)
	//	panic(any(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()))
	}
	APPNAME = appNameCn

	// 初始化内部服务配置

	// 接口返回加密KEY
	DesKey = config["des_key"]

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

	// 聚合短信,国内AppKey
	JhGnAppKey = config["jh_gn_app_key"]
	JhGjAppKey = config["jh_gj_app_key"]

	// ppt 转图片服务地址
	Ppt2ImageUrl = config["ppt2_image_url"]

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

	// 代理资源地址
	ResourceProxyUrl = config["resource_proxy_url"]
	RESOURCE_DIR = config["resource_dir"]
	if RESOURCE_DIR == "" {
		RESOURCE_DIR = "eta/"
	}

	// 系统内部服务地址
	{
		// 公共指标库相关
		EDB_LIB_URL = config["edb_lib_url"]
		APP_EDB_LIB_NAME_EN = config["app_edb_lib_name_en"]
		EDB_LIB_Md5_KEY = config["edb_lib_md5_key"]

		// 图表项目域名
		PublicChartHost = config["public_chart_host"]

		// 钢联化工服务地址
		MySteelPostUrl = config["mysteel_post_url"]

		// 发送微信模板消息地址
		SendWxTemplateMsgUrl = config["send_wx_template_msg_url"]

		// 发送微信模板消息地址
		SendTemplateMsgAuthorization = config["send_template_msg_authorization"]

		// 语音分贝处理的地址
		HandleVideoDecibelUrl = config["handle_video_decibel_url"]

		// 弘则open api的地址
		HongzeOpenApiHost = config["hongze_open_api_host"]

		// 英文研报分享的地址
		EnglishShareUrl = config["english_share_url"]

		// 策略报告地址
		EnPolicyReportUrl = config["en_policy_report_url"]

		// 谷歌翻译服务地址
		GoogleTranslateUrl = config["google_translate_url"]

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

		// chatGPT服务地址
		ChatUrl = config["chat_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密钥-解密数据用
		EtaBridgeLoginUrl = config["eta_bridge_login_url"]    // eta桥接服务-登录接口地址
		EtaBridgeLogoutUrl = config["eta_bridge_logout_url"]  // eta桥接服务-登出接口地址
	}

	//日志配置
	{
		LogPath = config["log_path"]
		LogFile = config["log_file"]
		LogDataPath = config["log_data_path"]
		LogDataFile = config["log_data_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配置
	{
		ES_URL = config["es_url"]
		ES_USERNAME = config["es_username"]
		ES_PASSWORD = config["es_password"]
	}

	// 微信相关
	{
		WxAppId = config["wx_appid"]
		WxAppSecret = config["wx_app_secret"]
		WxId = config["wx_id"]
		//模板消息
		TemplateIdByProduct = config["template_id_by_product"]

		WxYbAppId = config["wx_yb_appid"]          //弘则研报小程序
		WxYbId = config["wx_yb_id"]                // 研报小程序微信原始ID
		WxYbAppSecret = config["wx_yb_app_secret"] // 研报小程序秘钥
		wxYbPlatformStr := config["wx_yb_platform"]
		if wxYbPlatformStr != `` {
			WxYbPlatform, err = strconv.Atoi(wxYbPlatformStr) //弘则研报来源
			if err != nil {
				panic(any("配置文件读取wx_yb_platform错误 " + err.Error()))
			}
		}
	}

	// 对象存储客户端
	ObjectStorageClient = config["object_storage_client"]

	// ppt上传是否走后端
	PptUpdateApi = config["ppt_update_api"]
	// OSS相关
	{
		Endpoint = config["endpoint"]
		Bucketname = config["bucket_name"]
		Imghost = config["img_host"]
		UploadDir = config["upload_dir"]
		Upload_Audio_Dir = config["upload_audio_dir"]
		AccessKeyId = config["access_key_id"]
		AccessKeySecret = config["access_key_secret"]
	}

	// OSS相关(前端使用)
	{
		AliStsScheme = config["ali_sts_scheme"]
		RegionId = config["region_id"]
		RoleArn = config["role_arn"]
		RoleSessionName = config["role_session_name"]
		RAMAccessKeyId = config["ram_access_key_id"]
		RAMAccessKeySecret = config["ram_access_key_secret"]
		STSTokenCacheKey = config["sts_token_cache_key"]
	}

	// 阿里云邮箱配置
	{
		AliyunEmailAccountName = config["aliyun_email_account_name"]
		AliyunEmailAccessKeyId = config["aliyun_email_access_key_id"]
		AliyunEmailAccessKeySecret = config["aliyun_email_access_key_secret"]
		AliyunEmailReplyAddress = config["aliyun_email_reply_address"]
		AliyunEmailReplyAddressAlias = config["aliyun_email_reply_address_alias"]
	}

	// 腾讯云邮箱配置
	{
		TencentSDKSecretId = config["tencent_sdk_secret_id"]                      // 腾讯云主账号SecretId
		TencentSDKSecretKey = config["tencent_sdk_secret_key"]                    // 腾讯云主账号SecretKey
		TencentEmailFromEmailAddress = config["tencent_email_from_email_address"] // 腾讯云邮件发信地址

		tencentEmailTemplateIDtr := config["tencent_email_template_id"]
		if tencentEmailTemplateIDtr != `` {
			tmpTencentEmailTemplateID, err := strconv.Atoi(tencentEmailTemplateIDtr) //弘则研报来源
			if err != nil {
				panic(any("配置文件读取tencent_email_template_id错误 " + err.Error()))
			}
			TencentEmailTemplateID = uint64(tmpTencentEmailTemplateID)
		}
	}

	// 科大讯飞
	{
		//XfAPPID = config["xf_appid"]
		//XfAPIKey = config["xf_api_key"]
		//XfAPISecret = config["xf_api_secret"]
		XfHostUrl = config["xf_host_url"]
		//XfOrigin = config["xf_origin"]
		//XfVcn = config["xf_vcn"]
	}

	// ES 索引
	{
		DATA_INDEX_NAME = config["data_index_name"]
		CHART_INDEX_NAME = config["chart_index_name"]
		MY_CHART_INDEX_NAME = config["my_chart_index_name"]
		EsReportIndexName = config["es_report_index_name"]
		EsEnglishReportIndexName = config["es_english_report_index_name"]
		EsSemanticAnalysisDocIndexName = config["es_semantic_analysis_doc_index_name"]
		SmartReportIndexName = config["es_smart_report_index_name"]
	}

	CrmEtaServerUrl = config["crm_eta_server_url"]
	CrmEtaServerDes3Key = config["crm_eta_server_des3_key"]
	LibreOfficePath = config["libre_office_path"]

	// eta_forum_hub ETA社区桥接服务地址
	{
		ETA_FORUM_HUB_URL = config["eta_forum_hub_url"]
		ETA_FORUM_HUB_NAME_EN = config["eta_forum_hub_name_en"]
		ETA_FORUM_HUB_MD5_KEY = config["eta_forum_hub_md5_key"]
	}
	// 商家编码
	BusinessCode = config["business_code"]
	// eta_mini_bridge 小程序桥接服务地址
	{
		ETAMiniBridgeUrl = config["eta_mini_bridge_url"]
		ETA_MINI_APPID = config["eta_mini_bridge_appid"]       // 桥接服务-鉴权用
		ETA_MINI_APP_SECRET = config["eta_mini_bridge_secret"] // 桥接服务-鉴权用
	}

	// MinIo相关
	{
		MinIoEndpoint = config["minio_endpoint"]
		MinIoBackEndpoint = config["minio_back_endpoint"]
		MinIoBucketname = config["minio_bucket_name"]
		MinIoImghost = config["minio_img_host"]
		MinIoUploadDir = config["minio_upload_dir"]
		MinIoUpload_Audio_Dir = config["minio_upload_audio_dir"]
		MinIoAccessKeyId = config["minio_access_key_id"]
		MinIoAccessKeySecret = config["minio_access_key_secret"]
		MinIoUseSSL = config["minio_use_ssl"]
		MinIoPort = config["minio_port"]
		MinIoRegion = config["minio_region"]
		MinIoFileDownloadHost = config["minio_file_download_host"]
	}

	// S3-OSS相关
	{
		S3Endpoint = config["s3_endpoint"]
		S3BackEndpoint = config["s3_back_endpoint"]
		S3BucketName = config["s3_bucket_name"]
		S3Host = config["s3_host"]
		S3AccessKeyId = config["s3_access_key_id"]
		S3AccessKeySecret = config["s3_access_key_secret"]
		S3UploadDir = config["s3_upload_dir"]
		S3Region = config["s3_region"]
		S3ForceStyle = config["s3_force_style"]
		S3EndpointPort = config["s3_endpoint_port"]
		S3Protocol = config["s3_protocol"]
		S3DisableSSL = config["s3_disable_ssl"]
		S3OpenAcl = config["s3_open_acl"]
	}

	// 生成长图服务地址
	PythonUrlReport2Img = config["python_url_report2img"]

	EtaAiUrl = config["eta_ai_url"]
	EtaAppid = config["eta_appid"]
	EtaSecret = config["eta_secret"]

	// chrome配置
	ChromePath = config["chrome_path"]

	// 初始化ES
	initEs()

	ErrMsgConfigFile = config["err_msg_config_file"]

	if ErrMsgConfigFile != "" {
		viper.SetConfigFile(ErrMsgConfigFile)
		err = viper.ReadInConfig()
		if err != nil {
			if _, ok := err.(viper.ConfigFileNotFoundError); ok {
				fmt.Println(errors.New("config file not found"))
				panic(any("config file not found"))
			} else {
				fmt.Println(errors.New("config file was found but another error was produced err:" + err.Error()))
				panic(any("config file was found but another error was produced err:" + err.Error()))
			}
			return
		}
		ViperConfig = viper.GetViper()
	}
}