package main

import (
	"flag"
	"log"
	"reflect"

	"github.com/pingcap/crm-bot/account"
	"github.com/pingcap/crm-bot/model"
	"github.com/pingcap/crm-bot/pkg/config"
	"github.com/pingcap/crm-bot/pkg/db"
	"github.com/pingcap/crm-bot/pkg/job"
	"github.com/pingcap/crm-bot/pkg/util"
	"github.com/pingcap/crm-bot/salesforce"
)

func main() {
	configName := flag.String("c", "config.yml", "config file name")
	flag.Parse()

	config.InitConfig(*configName, "yml", "./etc")
	gdb, err := db.InitDb(config.GetString("db"))
	if err != nil {
		log.Fatal(err)
	}
	_ = gdb.AutoMigrate(&model.CRMAccount{})

	// salesforce
	tpl := salesforce.SFTpl{
		Object:         map[string]string{"q": "SELECT name, LastModifiedDate from Account Order by LastModifiedDate desc"},
		FilterFile:     "./etc/salesforce_account.csv",
		Fn:             salesforce.GetObejctByQuery,
		Topic:          "account",
		Type:           nil,
		LastUpdateTime: "",
		Delete:         false,
	}
	accounts := account.CrmAccounts(&tpl, true)
	err = gdb.Save(accounts).Error
	if err != nil {
		log.Panic(err)
	}

	// do delete
	delTpl := salesforce.SFTpl{
		Object:         map[string]string{"q": "SELECT Id, name, LastModifiedDate from Account where isDeleted = TRUE Order by LastModifiedDate desc"},
		FilterFile:     "./etc/salesforce_account.csv",
		Fn:             salesforce.GetDelObejctByFullQuery,
		Topic:          "account",
		Type:           reflect.TypeOf(model.CRMAccount{}),
		LastUpdateTime: "",
		Delete:         true,
		KeyMap:         map[string]string{"Id": "客户编号", "Name": "客户名称"},
	}
	delTpls := []salesforce.SFTpl{
		delTpl,
	}
	salesforce.Do(gdb, delTpls, false)

	job.Start()
	_, _ = job.AddJob("@every 4h", job.JobRunner(func() {
		accounts := account.CrmAccounts(&tpl, true)
		err = gdb.Save(accounts).Error
		if err != nil {
			log.Println("[error] CrmAccounts", err)
		}
		salesforce.Do(gdb, delTpls, false)
	}))

	log.Println("Server Started")
	util.GracefulShutdown(nil, nil)
	log.Println("Server exiting")
}
