package main

import (
	"fmt"
	"github.com/spf13/viper"
	"go.uber.org/zap"
	"jygit.jydev.jianyu360.cn/data_processing/common_utils/log"
	"jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
	"jygit.jydev.jianyu360.cn/data_processing/common_utils/udp"
	"os"
	"time"
)

var GF GlobalConf

func init() {
	err := InitConfig()
	if err != nil {
		fmt.Println("InitConfig err", err)
		os.Exit(1)
	}
	InitLog()
	InitMgo()
	loadData() //加载存量芜湖数据

	UdpClient = udp.UdpClient{Local: GF.Env.LocalPort, BufSize: 1024}
	UdpClient.Listen(processUdpMsg)
	log.Info("init", zap.String("LocalPort", GF.Env.LocalPort))
}

//InitConfig 初始化配置文件
func InitConfig() (err error) {
	viper.SetConfigFile("config.toml") // 指定配置文件路径
	viper.SetConfigName("config")      // 配置文件名称(无扩展名)
	viper.SetConfigType("toml")        // 如果配置文件的名称中没有扩展名，则需要配置此项

	viper.AddConfigPath("./")
	viper.AddConfigPath("./conf/")  // 还可以在工作目录中查找配置
	viper.AddConfigPath("../conf/") // 还可以在工作目录中查找配置
	err = viper.ReadInConfig()      // 查找并读取配置文件
	if err != nil {                 // 处理读取配置文件的错误
		return
	}

	err = viper.Unmarshal(&GF)

	return err

}

//InitLog 初始化log
func InitLog() {
	now := time.Now()
	err := log.InitLog(
		log.Path(GF.Log.LogPath),
		log.Level(GF.Log.LogLevel),
		log.Compress(GF.Log.Compress),
		log.MaxSize(GF.Log.MaxSize),
		log.MaxBackups(GF.Log.MaxBackups),
		log.MaxAge(GF.Log.MaxAge),
		log.Format(GF.Log.Format),
	)
	if err != nil {
		fmt.Printf("InitLog failed: %v\n", err)
		os.Exit(1)
	}

	log.Info("InitLog", zap.Any("duration", time.Since(now).Seconds()))
}

//InitMgo 初始化mgo
func InitMgo() {
	now := time.Now()
	Mgo = &mongodb.MongodbSim{
		MongodbAddr: GF.Mongo.Host,
		DbName:      GF.Mongo.DB,
		Size:        10,
		UserName:    GF.Mongo.Username,
		Password:    GF.Mongo.Password,
	}
	Mgo.InitPool()
	log.Info("InitMgo", zap.Any("duration", time.Since(now).Seconds()))
}

//loadData 加载芜湖存量企业数据
func loadData() {
	now := time.Now()
	sess := Mgo.GetMgoConn()
	defer Mgo.DestoryMongoConn(sess)
	it := sess.DB("mixdata").C(GF.Env.QyxyColl).Find(nil).Iter()
	index := 0
	for tmp := make(map[string]interface{}); it.Next(&tmp); index++ {
		if index%10000 == 0 {
			//log.Println(index, tmp["company_name"])
		}
		name := fmt.Sprint(tmp["company_name"])
		tree.Add(name)
		tmp = map[string]interface{}{}
	}
	log.Info("loadData", zap.Any("duration", time.Since(now).Seconds()))
	log.Info("loadData", zap.Int("加载芜湖企业存量数据结束", index))
}
