package tenantaction

import (
	"context"

	opent "github.com/tidbcloud/devops/entity/operation"
	"github.com/tidbcloud/devops/pkg/service/operation/actions"
)

var (
	ActionAddImpersonate opent.ActionMetadata = opent.ActionMetadata{
		Name: "AddImpersonate",
		Type: opent.ActionTypeAuto,
	}
)

type addImpersonate struct {
	actions.BaseAction
	comps *actions.Components
}

func NewAddImpersonate(comps *actions.Components) actions.AutoAction {
	return &addImpersonate{comps: comps}
}

func (a *addImpersonate) Metadata() opent.ActionMetadata {
	return ActionAddImpersonate
}

func (a *addImpersonate) PreCheck(ctx context.Context, instance *opent.Instance) error {
	tid, err := a.getParam(instance)
	if err != nil {
		return err
	}

	_, err = a.comps.TenantAPI.GetTenant(ctx, tid)
	if err != nil {
		return err
	}

	return nil
}

func (a *addImpersonate) Start(ctx context.Context, instance *opent.Instance) (*actions.ActionResult, error) {
	tid, err := a.getParam(instance)
	if err != nil {
		return actions.FailedActionResult(err), nil
	}

	err = a.comps.TenantAPI.AddImpersonate(ctx, instance.Applicant, tid)
	if err != nil {
		return actions.FailedActionResult(err), nil
	}

	return actions.SucceededActionResult(nil), nil // return succeeded directly
}

func (a *addImpersonate) Result(ctx context.Context, instance *opent.Instance) (*actions.ActionResult, error) {
	return actions.SucceededActionResult(nil), nil
}

func (a *addImpersonate) getParam(instance *opent.Instance) (uint64, error) {
	return actions.GetTenantID(instance)
}
