package opworker

import (
	"context"

	"github.com/tidbcloud/account/internel/svc/org"

	"github.com/tidbcloud/account/central/utils"
	"github.com/tidbcloud/account/commons/database"

	"github.com/tidbcloud/tiinf/monitor/tilog"

	"go.opentelemetry.io/otel"

	"github.com/tidbcloud/account/central/jobqueue"
	"github.com/tidbcloud/account/commons/config"
	"go.uber.org/zap"
	"gorm.io/gorm"
)

type syncTenantWorker struct{ GlobalWorker }

func (w syncTenantWorker) Run(ctx2 context.Context) error {

	ctx, span := otel.Tracer(config.TraceComponentNameWorker).Start(ctx2, "syncTenantWorker")
	defer span.End()
	bm := utils.Begin(ctx, "syncTenantWorker")
	defer bm.OnExit(ctx)
	tilog.Info(ctx, "start to sync all un-synced salesforce records")
	salesforceConfig := config.Global().SalesforceConfig
	if !salesforceConfig.EnableSalesforce {
		return nil
	}

	err := database.Transaction(func(tx *gorm.DB) error {
		records, err := org.GetAllUnSyncedSalesforceRecords(ctx, tx)
		if err != nil {
			tilog.Info(ctx, "failed to get all un-synecd salesforce record", zap.Error(err))
			return err
		}
		tilog.Info(ctx, "get  un-syned salesforce record", zap.Any("record", records))

		for _, i := range records {
			req := config.SyncSalesforceSchema{TenantID: i.TenantID.Uint64()}
			err = jobqueue.Enqueue(ctx, config.JobSyncSalesforce, req)
			tilog.Info(ctx, "enqueue un-syned salesforce record", zap.Any("record", i), zap.Error(err))
		}

		return nil
	})
	if err != nil {
		tilog.Info(ctx, "failed to enqueue un-synced salesforce record", zap.Error(err))
	} else {
		tilog.Info(ctx, "all un-synced salesforce re-enqueue success")
	}

	return nil
}
