package repo

import (
	"context"
	"time"

	"github.com/tidbcloud/pkgv2/bizerr"
	"github.com/tidbcloud/serverless-service/internal/domain/constant"
	"github.com/tidbcloud/serverless-service/internal/domain/entity"
	"github.com/tidbcloud/serverless-service/internal/domain/vo"
)

type BranchFilter struct {
	Statuses          []constant.BranchStatus
	CreatedAfter      *time.Time
	CreatedAtOrBefore *time.Time
}

type BranchRepo interface {
	Create(ctx context.Context, record *entity.Branch) (err bizerr.BizError)
	// GORM doesn't update default value, to do it, pass all updated column names to `columns`
	Update(ctx context.Context, record *entity.Branch, columns []string, where map[string]any) bizerr.BizError
	GetBranchByID(ctx context.Context, id string) (branch *entity.Branch, err bizerr.BizError)
	GetBranchByNameAndMainBranchID(
		ctx context.Context,
		branchName string,
		mainBranchID string,
	) (branch *entity.Branch, err bizerr.BizError)
	CountBranchesByMainBranchID(ctx context.Context, mainBranchID string) (count int64, err bizerr.BizError)
	CountBranchesByOrgID(ctx context.Context, org uint64) (count int64, err bizerr.BizError)
	ListBranchesByMainBranchIDInPage(
		ctx context.Context,
		mainBranchID string,
		opt vo.ListBranchesOpt,
	) (branches []*entity.Branch, err bizerr.BizError)
	ListBranchesByMainBranchID(
		ctx context.Context,
		mainBranchID string,
		deleteAfterTime *time.Time,
	) (branches []*entity.Branch, err bizerr.BizError)
	ListBranchesByParentID(
		ctx context.Context,
		mainBranchID string,
		parentID string,
	) (branches []*entity.Branch, err bizerr.BizError)
	CountBranchesByStatus(ctx context.Context) (branchStatusCount []*entity.BranchStatusCount, err bizerr.BizError)
	ListCreatingBranches(ctx context.Context) (branches []*entity.Branch, err bizerr.BizError)
	ListBranchesByStatuses(
		ctx context.Context,
		statuses ...constant.BranchStatus,
	) (branches []*entity.Branch, err bizerr.BizError)
	ListBranchesByFilter(
		ctx context.Context,
		filter BranchFilter,
	) (branches []*entity.Branch, err bizerr.BizError)
	ListBranchesByMainBranchIDAndIDs(
		ctx context.Context,
		mainBranchID string,
		ids []string,
	) (branches []*entity.Branch, err bizerr.BizError)
	ListRunningBranches(ctx context.Context) (branches []*entity.Branch, err bizerr.BizError)
}
