package backend

import (
	"context"

	"github.com/tidbcloud/chaos-svc/pkg/domain/entity"
	"github.com/tidbcloud/chaos-svc/pkg/domain/facade"
	"github.com/tidbcloud/chaos-svc/pkg/domain/repo"
	"github.com/tidbcloud/pkgv2/bizerr"
)

type DisableBackendSvc interface {
	Execute(ctx context.Context, params *DisableBackendParam) bizerr.BizError
}

type DisableBackendParam struct {
	ProjectID   uint64
	NetworkName string
	UserID      uint64
}

type disableBackendImp struct {
	backendRepo repo.BackendRepo
	infraFacade facade.Infra
	timeFacade  facade.Time
}

func NewDisableBackendSvc(
	backendRepo repo.BackendRepo,
	infraFacade facade.Infra,
	timeFacade facade.Time,
) DisableBackendSvc {
	return &disableBackendImp{
		backendRepo: backendRepo,
		infraFacade: infraFacade,
		timeFacade:  timeFacade,
	}
}

func (imp *disableBackendImp) Execute(ctx context.Context, params *DisableBackendParam) bizerr.BizError {
	var backendEntity *entity.Backend
	backendEntity, err := imp.backendRepo.Load(ctx, params.ProjectID, params.NetworkName)
	if err != nil {
		return err
	}

	if err := backendEntity.StartDisable(params.UserID, imp.timeFacade.Now()); err != nil {
		return err
	}
	if err := imp.infraFacade.DeleteChaosServerIgnoreNotFound(ctx, params.ProjectID, params.NetworkName); err != nil {
		return err
	}
	if err := imp.backendRepo.Save(ctx, backendEntity); err != nil {
		return err
	}
	return nil
}
