package jobs

import (
	"context"
	"encoding/json"
	"strconv"

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

	"github.com/tidbcloud/account/central/jobqueue"
	"github.com/tidbcloud/account/commons/config"
	"github.com/tidbcloud/account/commons/database"
	"github.com/tidbcloud/account/internel/dao/entity"
	"github.com/tidbcloud/pkgv2/zendesk"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	"go.uber.org/zap"
	"gorm.io/gorm"
)

func SyncZendesk(ctx context.Context, payload []byte) error {
	return jobqueue.CatchError(ctx, func() error {
		var req config.SyncZendeskDataSchema
		if err := json.Unmarshal(payload, &req); err != nil {
			return err
		}

		if !config.Global().ZendeskConfig.EnableZendesk {
			tilog.Info(ctx, "Zendesk is disabled, skip sync zendesk data", zap.Any("payload", req))
			return nil
		}

		var tenant entity.Tenant
		err := database.Transaction(func(tx *gorm.DB) error {
			var err error
			tenant, err = org.GetTenantByID(tx, entity.ID(req.TenantID))
			return err
		})
		if err != nil {
			tilog.Error(ctx, "failed to find tenant", zap.Error(err), zap.Uint64("tenantID", req.TenantID))
			return err
		}

		email := tenant.Email
		zendeskConfig := config.Global().ZendeskConfig
		if zendeskConfig.EnableZendesk {
			orgReq := zendesk.Organization{
				Name:       tenant.Name,
				ExternalID: strconv.FormatUint(uint64(tenant.ID), 10),
			}

			org, err := zendeskClient.CreateOrganization(orgReq)
			if err != nil {
				if zerr, ok := err.(zendesk.Error); ok && zerr.Status() == 422 {
					tilog.Info(ctx, "failed to create organization on Zendesk, name already taken, ignore", zap.String("name", tenant.Name), zap.String("feature", "signup"), zap.Error(err))
					return nil
				}
				tilog.Warn(ctx, "failed to create organization on Zendesk", zap.String("name", tenant.Name), zap.String("feature", "signup"), zap.Error(err))
				return err
			}
			tenant.ZendeskID = entity.ID(org.ID)
			err = database.Transaction(func(tx *gorm.DB) error {
				return tenant.Update(tx, entity.TenantDBSchema.ZendeskID)
			})
			if err != nil {
				tilog.Warn(ctx, "failed to update organization ZendeskID", zap.String("email", email), zap.String("feature", "signup"), zap.Error(err))
				return err
			}
		}

		return nil
	})
}

func SaveZendeskJobData(ctx context.Context, orgId uint64) {
	//zendeskData := config.SyncZendeskDataSchema{
	//	TenantID: orgId,
	//}
	//
	//err := jobqueue.Enqueue(config.JobSyncZendesk, zendeskData)
	//if err != nil {
	//	tilog.Error(ctx, "failed to sync zendesk", zap.Any("orgId", orgId), zap.Error(err))
	//}
	//tilog.Info(ctx, "save sync zendesk data success", zap.Any("orgId", orgId))

}
