package gitcode

import (
	"context"
	"time"
)

type Client interface {
	ListIssues(context.Context, IssueListRequest) (Page[IssueSummary], error)
	GetIssue(context.Context, IssueRequest) (Issue, error)
	ListIssueComments(context.Context, IssueRequest) (Page[Comment], error)
	ListPRs(context.Context, PRListRequest) (Page[PullRequest], error)
	GetPR(context.Context, PRRequest) (PullRequest, error)
	ListPRComments(context.Context, PRRequest) (Page[PRComment], error)
	CreatePR(context.Context, CreatePRRequest, WriteOptions) (WriteResult[PullRequest], error)
	UpdatePR(context.Context, UpdatePRRequest, WriteOptions) (WriteResult[PullRequest], error)
	MergePR(context.Context, MergePRRequest, WriteOptions) (WriteResult[PullRequest], error)
	LinkPRIssue(context.Context, LinkPRIssueRequest, WriteOptions) (WriteResult[[]Issue], error)
	GetWikiPage(context.Context, WikiPageRequest) (WikiPage, error)
	ListWikiPages(context.Context, WikiListRequest) (Page[WikiPage], error)
	Search(context.Context, SearchRequest) (Page[SearchResult], error)
	ListIssueAttachments(context.Context, IssueRequest) (Page[AttachmentSummary], error)
	GetAttachment(context.Context, AttachmentRequest) (AttachmentBody, error)
	CreateIssue(context.Context, CreateIssueRequest, WriteOptions) (WriteResult[Issue], error)
	UpdateIssue(context.Context, UpdateIssueRequest, WriteOptions) (WriteResult[Issue], error)
	CreateIssueComment(context.Context, CreateIssueCommentRequest, WriteOptions) (WriteResult[Comment], error)
	UpdateIssueComment(context.Context, UpdateIssueCommentRequest, WriteOptions) (WriteResult[Comment], error)
	CreatePRComment(context.Context, CreatePRCommentRequest, WriteOptions) (WriteResult[PRComment], error)
	CreatePRReviewComment(context.Context, CreatePRReviewCommentRequest, WriteOptions) (WriteResult[PRComment], error)
	ReplyPRReviewComment(context.Context, ReplyPRReviewCommentRequest, WriteOptions) (WriteResult[PRComment], error)
	CreateWikiPage(context.Context, CreateWikiPageRequest, WriteOptions) (WriteResult[WikiPage], error)
	UpdateWikiPage(context.Context, UpdateWikiPageRequest, WriteOptions) (WriteResult[WikiPage], error)
	DeleteWikiPage(context.Context, DeleteWikiPageRequest, WriteOptions) (WriteResult[WikiPage], error)
	AddLabel(context.Context, LabelRequest, WriteOptions) (WriteResult[Issue], error)
	RemoveLabel(context.Context, LabelRequest, WriteOptions) (WriteResult[Issue], error)
	ListMilestones(context.Context, MilestoneListRequest) (Page[Milestone], error)
	ListPushRemoteMirrors(context.Context, PushMirrorListRequest) ([]PushMirror, error)
	TriggerPushRemoteMirror(context.Context, PushMirrorTriggerRequest, WriteOptions) (WriteResult[PushMirror], error)
	GetMilestone(context.Context, MilestoneRequest) (Milestone, error)
	CreateMilestone(context.Context, MilestoneWriteRequest, WriteOptions) (WriteResult[Milestone], error)
	UpdateMilestone(context.Context, MilestoneWriteRequest, WriteOptions) (WriteResult[Milestone], error)
	GetRelease(context.Context, ReleaseRequest) (Release, error)
	CreateRelease(context.Context, ReleaseWriteRequest, WriteOptions) (WriteResult[Release], error)
	UpdateRelease(context.Context, ReleaseWriteRequest, WriteOptions) (WriteResult[Release], error)
}

// RepositoryIssueCommentLister is an optional compatibility surface. Clients
// that do not implement GitCode's repository-wide endpoint continue to use the
// per-issue ListIssueComments path.
type RepositoryIssueCommentLister interface {
	ListRepositoryIssueComments(context.Context, RepositoryIssueCommentListRequest) (Page[Comment], error)
}

type Config struct {
	BaseURL         string
	Token           string
	Timeout         time.Duration
	MaxResponseSize int64
	MaxRetries      int
	UserAgent       string
	Pagination      PaginationConfig
	RateLimitRPS    float64
	RateLimitBurst  int
}

type PaginationConfig struct {
	Page     int
	PerPage  int
	Strategy PaginationStrategy
}