package main

import (
	"box-cost/el"
	"box-cost/model"
	"context"
	"fmt"
	"log"
	"os"
	"time"

	"github.com/spf13/viper"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/bson/primitive"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
)

const (
	MONGODB_URI = "mongodb://root:boxcost@124.71.139.24:37030/box-cost?authSource=admin"
	CONFIG_FILE = "app.yaml"
)

type AppConf struct {
	Plans []string `yaml:"plans"`
}

func LoadConfFile() (*AppConf, error) {
	file, err := os.Open(CONFIG_FILE)
	if err != nil {
		fmt.Println("open file err:", err)
		return nil, err
	}
	v := viper.New()
	v.SetConfigType("yaml")
	err = v.ReadConfig(file)
	if err != nil {
		return nil, err
	}
	c := new(AppConf)
	err = v.Unmarshal(c)
	return c, err
}

func main() {
	// 读取配置
	conf, err := LoadConfFile()
	if err != nil {
		log.Fatal(err)
	}
	planIds := conf.Plans

	// 连接数据库
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	client, err := mongo.Connect(ctx, options.Client().ApplyURI(MONGODB_URI))
	if err != nil {
		log.Fatal(err)
	}
	defer cancel()
	if err != nil {
		log.Fatal(err)
	}
	defer client.Disconnect(ctx)

	collection := client.Database("box-cost").Collection("product-plan")

	var objectIds []primitive.ObjectID
	for _, planIdstr := range planIds {
		planId, _ := primitive.ObjectIDFromHex(planIdstr)
		objectIds = append(objectIds, planId)
	}

	// 创建聚合管道
	pipeline := mongo.Pipeline{
		{{Key: "$match", Value: bson.D{{Key: "_id", Value: bson.D{{Key: "$in", Value: objectIds}}}}}},
	}

	// 构建查询管道
	// pipeline := make([]bson.M, 0)
	// for _, planIdstr := range planIds {
	// 	planId, _ := primitive.ObjectIDFromHex(planIdstr)
	// 	pipeline = append(pipeline, bson.M{"$match": bson.M{"_id": planId}})
	// }

	// 执行聚合查询
	cursor, err := collection.Aggregate(context.Background(), pipeline)
	if err != nil {
		log.Fatal(err)
	}
	defer cursor.Close(context.Background())
	// 获取结果
	plans := make([]*model.ProductPlan, 0)
	err = cursor.All(context.Background(), &plans)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("更新中,请稍等...")
	// 更新excel
	el.UpdateExcel(client, plans)

}