package api

import (
	"context"
	"time"

	gitent "github.com/tidbcloud/devops/entity/github"
	relent "github.com/tidbcloud/devops/entity/release"
)

type GetReleaseParam struct {
	WithTickets bool
}

type ListReleaseParam struct {
	GetReleaseParam

	// filter
	Names         []string
	Statuses      []relent.ReleaseStatus
	ReleaseBefore time.Time
	ReleaseAfter  time.Time

	Page    int // default 1
	PerPage int // default 100
}

func (l ListReleaseParam) Normalize() (ListReleaseParam, error) {
	if l.Page < 0 {
		l.Page = 1
	}
	if l.PerPage < 0 {
		l.PerPage = 100
	}

	return l, nil
}

type ListTicketsParam struct {
	Names    []string
	Statuses []string
	Releases []string

	Page    int // default 0 (means all)
	PerPage int
}

func (l ListTicketsParam) Normalize() ListTicketsParam {
	return l
}

type GetTicketParam struct {
	WithGithubPR bool
}

type UpdateTicketParam struct {
	GithubPRLocations *[]gitent.PRLocation
}

type ReleaseServiceAPI interface {
	ListReleases(ctx context.Context, param ListReleaseParam) ([]*relent.Release, int64, error)
	GetRelease(ctx context.Context, id uint64, param GetReleaseParam) (*relent.Release, error)
	SyncRelease(ctx context.Context) error

	ListTickets(ctx context.Context, param ListTicketsParam) ([]*relent.ReleaseTicket, int64, error)
	GetTicket(ctx context.Context, name string, param GetTicketParam) (*relent.ReleaseTicket, error)
	UpdateTicket(ctx context.Context, name string, param UpdateTicketParam) error
	CloseTickets(ctx context.Context, ticketNames []string) error
	SyncTicketsAsync(ctx context.Context, ticketNames []string) error
}
