package userbehavior

import (
	"context"
	"fmt"

	"github.com/expr-lang/expr"
	larkcard "github.com/larksuite/oapi-sdk-go/v3/card"
	"github.com/tidbcloud/dataflow-service/idl/pbgen/proto/dm"
	ubent "github.com/tidbcloud/devops/entity/userbehavior"
)

var (
	DMJobBehaviorPredicateCreate string = "create"
)

type dmJobUBEvent struct {
	originEntity           *dm.Job
	tenantName             *string
	tenantID               uint64
	tenantAlias            *string
	bizRegion              *string
	clusterID              uint64
	clusterName            *string
	dmJobBehaviorPredicate *string
	extraInfo              string
}

func (event *dmJobUBEvent) HandleUBEvent(ctx context.Context) error {
	return nil
}

func (event *dmJobUBEvent) PreProcess(ctx context.Context) error {
	return nil
}

func (event *dmJobUBEvent) PostProcess(ctx context.Context) error {
	return nil
}

func (event *dmJobUBEvent) ProcessTemplate(ctx context.Context, template string) (string, error) {
	return template, nil
}

func (event *dmJobUBEvent) DefaultText(ctx context.Context) string {
	var tenantName, tenantAlias string
	if event.tenantName != nil {
		tenantName = *event.tenantName
	}
	if event.tenantAlias != nil {
		tenantAlias = *event.tenantAlias
	}

	return fmt.Sprintf("[** %s **] Tenant** %s **(%d, alias: %s) ** %s ** a dm job. Cluster: ** %s **(%d)\nDetail: %s",
		*event.bizRegion,
		tenantName,
		event.tenantID,
		tenantAlias,
		*event.dmJobBehaviorPredicate,
		*event.clusterName,
		event.clusterID,
		event.extraInfo,
	)
}

func (event *dmJobUBEvent) GetAvailableParams(ctx context.Context) []string {
	return clusterEventParams
}

func (event *dmJobUBEvent) GetUBEventType() ubent.UBEventTp {
	return ubent.UBEventDMJob
}

func (event *dmJobUBEvent) CustomFilter(ctx context.Context, textFilter string) (ret bool, err error) {
	program, err := expr.Compile(textFilter)
	if err != nil {
		return ret, err
	}

	output, err := expr.Run(program, event.originEntity)
	if err != nil {
		return ret, err
	}
	ret, ok := output.(bool)
	if !ok {
		return ret, fmt.Errorf("not return a bool type")
	}

	return ret, nil
}

func newDMJobEvent(job *dm.Job, tenantId uint64, clusterId uint64) UBEvent {
	return &dmJobUBEvent{
		tenantID:               tenantId,
		clusterID:              clusterId,
		dmJobBehaviorPredicate: &DMJobBehaviorPredicateCreate,
		originEntity:           job,
	}
}

func (e *dmJobUBEvent) BuildCustomCard(ctx context.Context) (*larkcard.MessageCard, error) {
	return nil, nil // Use standard card
}
