package action

import (
	userv1 "github.com/tidbcloud/aisupport/packages/sdk-go/contracts/api/core-server/user/v1"
	"github.com/tidbcloud/devops/entity/event"
	relent "github.com/tidbcloud/devops/entity/release"
	relsvcapi "github.com/tidbcloud/devops/pkg/service/release/api"
)

type actionCreateChange struct {
	*actionBase
}

func (a *actionCreateChange) Create(param relsvcapi.CreateChangeParam) error {
	ctx := a.Context
	spec := param.Spec

	rparam := relsvcapi.GetReleaseParam{WithTickets: true}
	release, err := a.ReleaseService.GetRelease(a.Context, spec.ReleaseID, rparam)
	if err != nil {
		return err
	}

	_, err = CheckChangeItems(ctx, release, spec.ChangeItemNames)
	if err != nil {
		return err
	}

	_, err = a.UserService.GetUser(a.Context, &userv1.GetUserRequest{Email: spec.ApplicantEmail})
	if err != nil {
		return err
	}

	_, err = a.ApplicationService.GetApplication(a.Context, spec.ApplicationName)
	if err != nil {
		return err
	}

	err = CheckDeployments(ctx, a.GithubService.RawAPI(), spec.Deployments)
	if err != nil {
		return err
	}

	param.Spec.Status = relent.ChangeStatusCreated
	if param.IsDraft {
		param.Spec.Status = relent.ChangeStatusDraft
		param.Spec.StatusReason = "The change is a draft, submit it to continue."
	}

	// save it to repo
	change, err := a.ChangeRepo.CreateChange(ctx, &param.Spec)
	if err != nil {
		return err
	}

	a.EventDetail.Create = &event.ChangeEventCreate{
		IsDraft: param.IsDraft,
	}
	a.Change = change
	return nil
}
