package main

import (
	"log"
	"reflect"

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

func main() {
	config.InitConfig("config.yml", "yml", "./etc")
	job.Start()

	var err error
	if config.GetBool("init") {
		err = bigquery.Init(tpls)
		if err != nil {
			log.Fatal(err)
		}
	}

	job.AddJob("0 12 * * ?", job.JobRunner(func() {
		log.Println("UpdateTablesByGCS")
		err := bigquery.UpdateTablesByGCS("pingcap/tidbcloud/metadb/dbaas")
		if err != nil {
			log.Println("[error] UpdateTablesByGCS ", err)
		}

		log.Println("CalNonProdAccountsBilling")
		err = bigquery.CalNonProdAccountsBilling()
		if err != nil {
			log.Println("[error] CalNonProdAccountsBilling ", err)
		}
	}))

	_, _ = job.AddJob("@every 2h", job.JobRunner(func() {
		CronJob(tpls)
	}))

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

func CronJob(tpls []bigquery.BigQuerySFTpl) {
	err := bigquery.UpdateSalesforce(tpls)
	if err != nil {
		log.Println("[error] bigquery update ", err, tpls)
	}

	//err = bigquery.SalesforceOppoFieldHistory()
	//if err != nil {
	//	log.Println("[error] SalesforceOppoFieldHistory ", err)
	//}
}

var tpls = []bigquery.BigQuerySFTpl{
	{
		salesforce.SFTpl{map[string]string{"q": "SELECT name, LastModifiedDate from Lead Order by LastModifiedDate desc"},
			"./etc/salesforce_lead.csv",
			salesforce.GetObejctByQuery,
			"Lead",
			reflect.TypeOf(model.PingcapSalesforceLead{}),
			"",
			false,
			map[string]string{},
		},
		reflect.TypeOf([]bigquery.PingcapSalesforceLead{}),
		bigquery.PingcapSalesforceLead{}.TableName(),
	},
	{
		salesforce.SFTpl{map[string]string{"q": "SELECT name, LastModifiedDate from Opportunity Order by LastModifiedDate desc"},
			"./etc/salesforce_opportunity.csv",
			salesforce.GetObejctByQuery,
			"Opportunity",
			reflect.TypeOf(model.PingcapSalesforceOpportunity{}),
			"",
			false,
			map[string]string{},
		},
		reflect.TypeOf([]bigquery.PingcapSalesforceOpportunity{}),
		bigquery.PingcapSalesforceOpportunity{}.TableName(),
	},
	{
		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:           reflect.TypeOf(model.CRMAccount{}),
			LastUpdateTime: "",
			Delete:         false,
		},
		reflect.TypeOf([]bigquery.CRMAccount{}),
		bigquery.CRMAccount{}.TableName(),
	},
	{
		salesforce.SFTpl{
			Object:         map[string]string{"q": "SELECT name, LastModifiedDate from PoC__c Order by LastModifiedDate desc"},
			FilterFile:     "./etc/salesforce_poc.csv",
			Fn:             salesforce.GetObejctByQuery,
			Topic:          "Poc",
			Type:           reflect.TypeOf(model.PingcapSalesforcePoc{}),
			LastUpdateTime: "",
			Delete:         false,
		},
		reflect.TypeOf([]bigquery.PingcapSalesforcePoc{}),
		bigquery.PingcapSalesforcePoc{}.TableName(),
	},
	{
		salesforce.SFTpl{
			Object:         map[string]string{"q": "SELECT subject, LastModifiedDate from Task Order by LastModifiedDate desc"},
			FilterFile:     "./etc/salesforce_task.csv",
			Fn:             salesforce.GetObejctByQuery,
			Topic:          "Task",
			Type:           reflect.TypeOf(model.PingcapSalesforceTask{}),
			LastUpdateTime: "",
			Delete:         false,
		},
		reflect.TypeOf([]bigquery.PingcapSalesforceTask{}),
		bigquery.PingcapSalesforceTask{}.TableName(),
	},
	{
		salesforce.SFTpl{
			Object:         map[string]string{"q": "SELECT name, LastModifiedDate from Invoice_Collection__c Order by LastModifiedDate desc"},
			FilterFile:     "./etc/salesforce_collection.csv",
			Fn:             salesforce.GetObejctByQuery,
			Topic:          "Collection",
			Type:           reflect.TypeOf(model.PingcapSalesforceCollection{}),
			LastUpdateTime: "",
			Delete:         false,
		},
		reflect.TypeOf([]bigquery.PingcapSalesforceCollection{}),
		bigquery.PingcapSalesforceCollection{}.TableName(),
	},
	{
		salesforce.SFTpl{
			Object:         map[string]string{"q": "SELECT name, LastModifiedDate from Order Order by LastModifiedDate desc"},
			FilterFile:     "./etc/salesforce_order.csv",
			Fn:             salesforce.GetObejctByQuery,
			Topic:          "Order",
			Type:           reflect.TypeOf(model.PingcapSalesforceOrder{}),
			LastUpdateTime: "",
			Delete:         false,
		},
		reflect.TypeOf([]bigquery.PingcapSalesforceOrder{}),
		bigquery.PingcapSalesforceOrder{}.TableName(),
	},
	{
		salesforce.SFTpl{
			Object:         map[string]string{"q": "SELECT name, LastModifiedDate from Revenue__c Order by LastModifiedDate desc"},
			FilterFile:     "./etc/salesforce_revrec.csv",
			Fn:             salesforce.GetObejctByQuery,
			Topic:          "Revrec",
			Type:           reflect.TypeOf(model.PingcapSalesforceRevrec{}),
			LastUpdateTime: "",
			Delete:         false,
		},
		reflect.TypeOf([]bigquery.PingcapSalesforceRevrec{}),
		bigquery.PingcapSalesforceRevrec{}.TableName(),
	},
}
