package jira

import (
	"github.com/andygrunwald/go-jira"
)

type JiraIssueService interface {
	Search(jql string, options *jira.SearchOptions) ([]jira.Issue, *jira.Response, error)
	GetTransitions(id string) ([]jira.Transition, *jira.Response, error)

	Create(issue *jira.Issue) (*jira.Issue, *jira.Response, error)
	UpdateWithOptions(issue *jira.Issue, opts *jira.UpdateQueryOptions) (*jira.Issue, *jira.Response, error)
	DoTransition(ticketID, transitionID string) (*jira.Response, error)
	AddComment(issueID string, comment *jira.Comment) (*jira.Comment, *jira.Response, error)
}

type JiraClientExtend struct {
	JiraCli *jira.Client
}

type JiraV3Issues struct {
	Issues        []jira.Issue `json:"issues"`
	IsLast        bool         `json:"isLast"`
	NextPageToken string       `json:"nextPageToken"`
}

func NewJiraClientExtend(jiraCli *jira.Client) *JiraClientExtend {
	return &JiraClientExtend{
		JiraCli: jiraCli,
	}
}

type SearchOptions struct {
	Expand          string   `json:"expand,omitempty"`
	Fields          []string `json:"fields,omitempty"`
	MaxResults      int      `json:"maxResults,omitempty"`
	JQL             string   `json:"jql,omitempty"`
	FieldsByKey     bool     `json:"fieldsByKey,omitempty"`
	NextPageToken   string   `json:"nextPageToken,omitempty"`
	Properties      []string `json:"properties,omitempty"`
	ReconcileIssues []string `json:"reconcileIssues,omitempty"`
}

// func (j *JiraClientV3) Search(jql string, options *jira.SearchOptions) ([]jira.Issue, *jira.Response, error) {
// 	result := make([]jira.Issue, 0)
// 	req, err := j.JiraCli.NewRequest("GET", "rest/api/3/search/jql", options)
// 	if err != nil {
// 		return result, nil, err
// 	}
// 	q := req.URL.Query()
// 	q.Set("jql", jql)
// 	if options.MaxResults > 0 {
// 		q.Set("maxResults", fmt.Sprintf("%d", options.MaxResults))
// 	}

// 	if len(options.Fields) > 0 {
// 		q.Set("fields", strings.Join(options.Fields, ","))
// 	}
// 	if options.Expand != "" {
// 		q.Set("expand", options.Expand)
// 	}
// 	req.URL.RawQuery = q.Encode()
// 	fmt.Printf("完整的请求URL: %s\n", req.URL.String())
// 	resp, err := j.JiraCli.Do(req, &result)
// 	return result, resp, err
// }

func (j *JiraClientExtend) Search(jql string, options *jira.SearchOptions) ([]jira.Issue, *jira.Response, error) {
	var result JiraV3Issues
	req, err := j.JiraCli.NewRequest("POST", "rest/api/2/search/jql", &SearchOptions{
		JQL:        jql,
		Fields:     options.Fields,
		MaxResults: options.MaxResults,
		Expand:     options.Expand,
	})
	if err != nil {
		return nil, nil, err
	}
	resp, err := j.JiraCli.Do(req, &result)
	return result.Issues, resp, err

}
func (j *JiraClientExtend) GetTransitions(id string) ([]jira.Transition, *jira.Response, error) {
	return j.JiraCli.Issue.GetTransitions(id)
}

func (j *JiraClientExtend) Create(issue *jira.Issue) (*jira.Issue, *jira.Response, error) {
	return j.JiraCli.Issue.Create(issue)
}

func (j *JiraClientExtend) UpdateWithOptions(issue *jira.Issue, opts *jira.UpdateQueryOptions) (*jira.Issue, *jira.Response, error) {
	return j.JiraCli.Issue.UpdateWithOptions(issue, opts)
}
func (j *JiraClientExtend) DoTransition(ticketID, transitionID string) (*jira.Response, error) {
	return j.JiraCli.Issue.DoTransition(ticketID, transitionID)
}
func (j *JiraClientExtend) AddComment(issueID string, comment *jira.Comment) (*jira.Comment, *jira.Response, error) {
	return j.JiraCli.Issue.AddComment(issueID, comment)
}
