// Copyright 2017 Drone.IO Inc. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package scm

import (
	"context"
	"time"
)

type (
	// PullRequest represents a repository pull request.
	PullRequest struct {
		Number  int
		Title   string
		Body    string
		Sha     string
		Ref     string
		Source  string
		Target  string
		Fork    string
		Link    string
		Diff    string
		Draft   bool
		Closed  bool
		Merged  bool
		Merge   string
		Base    Reference
		Head    Reference
		Author  User
		Created time.Time
		Updated time.Time
		Labels  []Label
	}

	// PullRequestInput provides the input fields required for creating a pull request.
	PullRequestInput struct {
		Title  string
		Body   string
		Source string
		Target string
	}

	// PullRequestListOptions provides options for querying
	// a list of repository merge requests.
	PullRequestListOptions struct {
		Page   int
		Size   int
		Open   bool
		Closed bool
	}

	// Change represents a changed file.
	Change struct {
		Path         string
		Added        bool
		Renamed      bool
		Deleted      bool
		Sha          string
		BlobID       string
		PrevFilePath string
	}

	Label struct {
		Name  string
		Color string
	}

	// Milestone the milestone
	Milestone struct {
		Number      int
		ID          int
		Title       string
		Description string
		Link        string
		State       string
		DueDate     time.Time
	}

	// PullRequestService provides access to pull request resources.
	PullRequestService interface {
		// Find returns the repository pull request by number.
		Find(context.Context, string, int) (*PullRequest, *Response, error)

		// FindComment returns the pull request comment by id.
		FindComment(context.Context, string, int, int) (*Comment, *Response, error)

		// Find returns the repository pull request list.
		List(context.Context, string, PullRequestListOptions) ([]*PullRequest, *Response, error)

		// ListChanges returns the pull request changeset.
		ListChanges(context.Context, string, int, ListOptions) ([]*Change, *Response, error)

		// ListComments returns the pull request comment list.
		ListComments(context.Context, string, int, ListOptions) ([]*Comment, *Response, error)

		// ListCommits returns the pull request commit list.
		ListCommits(context.Context, string, int, ListOptions) ([]*Commit, *Response, error)

		// Merge merges the repository pull request.
		Merge(context.Context, string, int) (*Response, error)

		// Close closes the repository pull request.
		Close(context.Context, string, int) (*Response, error)

		// Create creates a new pull request.
		Create(context.Context, string, *PullRequestInput) (*PullRequest, *Response, error)

		// CreateComment creates a new pull request comment.
		CreateComment(context.Context, string, int, *CommentInput) (*Comment, *Response, error)

		// DeleteComment deletes an pull request comment.
		DeleteComment(context.Context, string, int, int) (*Response, error)
	}
)
