package main

import (
	"flag"
	"log"
	"reflect"

	"github.com/aws/aws-lambda-go/lambda"

	"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()
	log.Println("config file name:", *configName)
	config.InitConfig(*configName, "yml", "./etc")
	if config.GetString("env") == "aws" {
		lambda.Start(salesforce.CrmSqs)
	} else {
		job.Start()
		gdb, err := db.InitDb(config.GetString("db"))
		if err != nil {
			log.Fatal(err)
		}
		gdb.AutoMigrate(&model.PingcapSalesforcePoc{},
			&model.PingcapSalesforceRevrec{},
			&model.PingcapSalesforceTask{},
			&model.PingcapSalesforceCollection{},
			&model.PingcapCrmCurrencyRate{},
			&model.PingcapSalesforceLead{},
			&model.PingcapSalesforceOpportunity{},
			&model.PingcapSalesforceOrder{},
			&model.CRMAccount{},
			&model.PingcapSalesforceOpportunityFieldHistory{})

		// run at beggining
		salesforce.Do(gdb, tpls, config.Get("init").(bool))
		job.AddJob("@every 2h", job.JobRunner(func() {
			salesforce.Do(gdb, tpls, false)
		}))
		log.Println("Server Started")
		util.GracefulShutdown(nil, nil)
		log.Println("Server exiting")
	}
}

var tpls = []salesforce.SFTpl{
	{
		map[string]string{"q": "SELECT subject, LastModifiedDate from Task Order by LastModifiedDate desc"},
		"./etc/salesforce_task.csv",
		salesforce.GetObejctByQuery,
		"task",
		reflect.TypeOf(model.PingcapSalesforceTask{}),
		"",
		false,
		map[string]string{},
	},
	{
		map[string]string{"q": "SELECT name, LastModifiedDate from PoC__c Order by LastModifiedDate desc"},
		"./etc/salesforce_poc.csv",
		salesforce.GetObejctByQuery,
		"poc",
		reflect.TypeOf(model.PingcapSalesforcePoc{}),
		"",
		false,
		map[string]string{},
	},
	{
		map[string]string{"q": "SELECT name, LastModifiedDate from Invoice_Collection__c Order by LastModifiedDate desc"},
		"./etc/salesforce_collection.csv",
		salesforce.GetObejctByQuery,
		"collection",
		reflect.TypeOf(model.PingcapSalesforceCollection{}),
		"",
		false,
		map[string]string{},
	},
	{
		map[string]string{"q": "SELECT name, LastModifiedDate from Revenue__c Order by LastModifiedDate desc"},
		"./etc/salesforce_revrec.csv",
		salesforce.GetObejctByQuery,
		"revrec",
		reflect.TypeOf(model.PingcapSalesforceRevrec{}),
		"",
		false,
		map[string]string{},
	},
	{map[string]string{"q": "SELECT name, LastModifiedDate from Lead Order by LastModifiedDate desc"},
		"./etc/salesforce_lead.csv",
		salesforce.GetObejctByQuery,
		"pingcap-salesforce-lead",
		reflect.TypeOf(model.PingcapSalesforceLead{}),
		"",
		false,
		map[string]string{},
	},
	{map[string]string{"q": "SELECT name, LastModifiedDate from Opportunity Order by LastModifiedDate desc"},
		"./etc/salesforce_opportunity.csv",
		salesforce.GetObejctByQuery,
		"pingcap-salesforce-opportunity",
		reflect.TypeOf(model.PingcapSalesforceOpportunity{}),
		"",
		false,
		map[string]string{},
	},

	{map[string]string{"q": "SELECT name, LastModifiedDate from Order Order by LastModifiedDate desc"},
		"./etc/salesforce_order.csv",
		salesforce.GetObejctByQuery,
		"pingcap-salesforce-order",
		reflect.TypeOf(model.PingcapSalesforceOrder{}),
		"",
		false,
		map[string]string{},
	},
	{map[string]string{"q": "SELECT Id, LastModifiedDate from Lead Where isDeleted = TRUE Order by LastModifiedDate desc"},
		"./etc/salesforce_lead.csv",
		salesforce.GetDelObejctByFullQuery,
		"pingcap-salesforce-lead",
		reflect.TypeOf(model.PingcapSalesforceLead{}),
		"",
		true,
		map[string]string{},
	},
	{map[string]string{"q": "SELECT Id, LastModifiedDate from Order Where isDeleted = TRUE Order by LastModifiedDate desc"},
		"./etc/salesforce_order.csv",
		salesforce.GetDelObejctByFullQuery,
		"pingcap-salesforce-order",
		reflect.TypeOf(model.PingcapSalesforceOrder{}),
		"",
		true,
		map[string]string{},
	},
	{map[string]string{"q": "SELECT Id, LastModifiedDate from Opportunity Where isDeleted = TRUE Order by LastModifiedDate desc"},
		"./etc/salesforce_opportunity.csv",
		salesforce.GetDelObejctByFullQuery,
		"pingcap-salesforce-opportunity",
		reflect.TypeOf(model.PingcapSalesforceOpportunity{}),
		"",
		true,
		map[string]string{},
	},
	{
		map[string]string{"q": "SELECT Id, name, LastModifiedDate from Invoice_Collection__c Where isDeleted = TRUE Order by LastModifiedDate desc"},
		"./etc/salesforce_collection.csv",
		salesforce.GetDelObejctByFullQuery,
		"collection",
		reflect.TypeOf(model.PingcapSalesforceCollection{}),
		"",
		true,
		map[string]string{},
	},
	{
		map[string]string{"q": "SELECT name, LastModifiedDate from Revenue__c Where isDeleted = TRUE Order by LastModifiedDate desc"},
		"./etc/salesforce_revrec.csv",
		salesforce.GetDelObejctByFullQuery,
		"revrec",
		reflect.TypeOf(model.PingcapSalesforceRevrec{}),
		"",
		true,
		map[string]string{"Name": "RevRecNumber"},
	},
	{
		map[string]string{"q": "SELECT name, LastModifiedDate from PoC__c Where isDeleted = TRUE Order by LastModifiedDate desc"},
		"./etc/salesforce_poc.csv",
		salesforce.GetDelObejctByFullQuery,
		"poc",
		reflect.TypeOf(model.PingcapSalesforcePoc{}),
		"",
		true,
		map[string]string{"Name": "PoCNumber"},
	},
	{
		map[string]string{"q": "SELECT Id, LastModifiedDate from Task Where isDeleted = TRUE Order by LastModifiedDate desc"},
		"./etc/salesforce_task.csv",
		salesforce.GetDelObejctByFullQuery,
		"task",
		reflect.TypeOf(model.PingcapSalesforceTask{}),
		"",
		true,
		map[string]string{"Id": "Id"},
	},
}
