package models

import (
	"LAPP_LF_MOM_BACKEND/conf"
	"LAPP_LF_MOM_BACKEND/db"
	"LAPP_LF_MOM_BACKEND/utils"
	"context"
	"fmt"
	"go.mongodb.org/mongo-driver/bson/primitive"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo/options"
	"log"
	"strings"
	"time"
)

type LeitServerLog struct {
	Level     string `bson:"level" json:"leit_server_log-level"`         //日志类别
	TimeStamp string `bson:"timestamp" json:"leit_server_log-timestamp"` //时间戳
	Message   string `bson:"message" json:"leit_server_log-message"`     //出错信息提示
	Function  string `bson:"function" json:"leit_server_log-function"`   //出错函数
	File      string `bson:"file" json:"leit_server_log-file"`           //出错文件
	Operator  string `bson:"operator" json:"leit_server_log-operator"`   //操作人员
}

type SerchData struct {
	Key    string
	Val    string
	Userid string
}

func (t *LeitServerLog) InsertRecord() (insertID primitive.ObjectID) {
	//1.初始化链接
	client := db.MgoDb()
	//2.选择数据库，数据表
	collect := client.Database(conf.DbConfig.Mongdbname).Collection("leit_server")
	insertRest, err := collect.InsertOne(context.TODO(), t)
	if err != nil {
		fmt.Println(err)
		return
	}
	insertID = insertRest.InsertedID.(primitive.ObjectID)
	return insertID
}

func (t *LeitServerLog) FindLog(logred SerchData, skip int64, limit int64) ([]*LeitServerLog, int64) {
	res := bson.M{}
	// 创建需要过滤的条件
	if logred.Key == "level" {
		res = bson.M{"level": primitive.Regex{Pattern: logred.Val}}
	}
	if logred.Key == "message" {
		res = bson.M{"message": primitive.Regex{Pattern: logred.Val}}
	}
	if logred.Key == "function" {
		res = bson.M{"function": primitive.Regex{Pattern: logred.Val}}
	}
	if logred.Key == "file" {
		res = bson.M{"file": primitive.Regex{Pattern: logred.Val}}
	}
	if logred.Key == "operator" {
		res = bson.M{"operator": primitive.Regex{Pattern: logred.Val}}
	}
	if logred.Key == "timestamp" {
		times := strings.Split(logred.Val, "-")
		stime := time.Unix(int64(utils.ValueToInt(times[0], 0)), 0)
		etime := time.Unix(int64(utils.ValueToInt(times[1], 0)), 0)
		stimestr := utils.TimeFormat(stime, "yyyyMMddHHmmss")
		etimestr := utils.TimeFormat(etime, "yyyyMMddHHmmss")
		res = bson.M{"timestamp": bson.M{"$lte": etimestr, "$gte": stimestr}}
	}
	if logred.Userid != "admin" {
		res = bson.M{"operator": logred.Userid}
	}
	//1.初始化链接
	client := db.MgoDb()
	//2.选择数据库，数据表
	collect := client.Database(conf.DbConfig.Mongdbname).Collection("leit_server")

	//var skip int64 = 0//从那个开始
	//var limit int64 = 2//炼制几个输出字段
	cursor, err := collect.Find(context.TODO(), res, &options.FindOptions{
		Skip:  &skip,
		Limit: &limit,
		Sort:  bson.D{{"timestamp", -1}},
	})

	if err != nil {
		fmt.Println(err)
		return nil, 0
	}
	defer cursor.Close(context.TODO())
	//创建需要反序列化成什么样子的结构体对象
	records := make([]*LeitServerLog, 0)
	for cursor.Next(context.TODO()) {
		record := &LeitServerLog{}
		//反序列化
		err = cursor.Decode(record)
		if err != nil {
			fmt.Println(err)
			return nil, 0
		}
		//追加
		records = append(records, record)
	}
	// 获取数据总数
	count, err := collect.CountDocuments(context.Background(), bson.D{})
	if err != nil {
		log.Fatal(count)
	}
	return records, count
}
