package worker

import (
	"context"
	"errors"

	"github.com/pingcap/dbaas/central/config"
	"github.com/pingcap/dbaas/central/db"
	"github.com/pingcap/dbaas/central/db/entity"
	"github.com/pingcap/dbaas/central/handler/billing2"
	"go.uber.org/zap"
	"gorm.io/gorm"
)

func (c BgContext) SyncEnableOnDemandByPayable() error {
	enable, err := c.IsOnDemandPlanEnabled()
	if err != nil {
		return err
	}
	if enable {
		return nil
	}

	resp, err := billing2.GetHandler().ListPayments(c.GetTenantID().Uint64())
	if err != nil {
		c.Log().Error("failed to query payments", zap.Error(err))
		return err
	}

	if !(len(resp) > 0 && resp[0].Payable) {
		c.Log().Info("tenant not payable")
		return nil
	}
	err = c.EnableOrgOnDemandPlan()

	if err != nil {
		c.Log().Error("synced tenant payable, failed start ondemand plan")
		return err
	}

	c.Log().Info("synced tenant payable and start ondemand plan")
	return nil
}

func (c BgContext) SyncUnSyncedSalesforce() error {
	salesforceConfig := config.Global().SalesforceConfig
	if !salesforceConfig.EnableSalesforce {
		return nil
	}
	db := db.NewProvider().WriteDB(context.Background())
	record := &entity.TenantSalesforceSyncRecord{}
	err := entity.NewTenantSalesforceSyncRecordQuerySet(db).TenantIDEq(c.GetTenantID()).One(record)
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil
		}
		return err
	}

	if record.Synced {
		return nil
	}

	err = c.SyncSalesforce()
	if err != nil {
		c.Log().Error("failed sync salesforce")
		return err
	}
	c.Log().Info("synced salesforce success")
	return nil
}
