package jira

import (
	"github.com/tidbcloud/devops/api"
	jiraent "github.com/tidbcloud/devops/entity/jira"
)

type ListUnifiedIssuesRequest struct {
	api.PaginationReq

	HaveTriage          *bool    `form:"have_triage" json:"have_triage"`
	HaveTimelineSummary *bool    `form:"have_timeline_summary" json:"have_timeline_summary"`
	StatusIn            []string `form:"status_in" json:"status_in"`
	CreatedAfter        *int64   `form:"created_after" json:"created_after"`
	CreatedBefore       *int64   `form:"created_before" json:"created_before"`
	ProjectIn           []string `form:"project_in" json:"project_in"`
	CustomerEnvIs       *string  `form:"customer_env_is" json:"customer_env_is"`
	ClusterIDIn         []string `form:"cluster_id_in" json:"cluster_id_in"`
	TenantIDIn          []string `form:"tenant_id_in" json:"tenant_id_in"`
	ComponentIn         []string `form:"component_in" json:"component_in"`
	IssueKeyIn          []string `form:"issue_key_in" json:"issue_key_in"`

	WithTriage          bool `form:"with_triage" json:"with_triage"`
	WithTimelineSummary bool `form:"with_timeline_summary" json:"with_timeline_summary"`
	WithJira            bool `form:"with_jira" json:"with_jira"`
	WithJiraComments    bool `form:"with_jira_comments" json:"with_jira_comments"`
}

type ListUnifiedIssuesResponse struct {
	api.BaseResp

	Total  int64                   `json:"total"`
	Issues []*jiraent.UnifiedIssue `json:"items"`
}

type GetUnifiedIssueRequest struct {
	WithTriage          bool `form:"with_triage" default:"false"`
	WithTimelineSummary bool `form:"with_timeline_summary" default:"false"`
}

type GetUnifiedIssueResponse struct {
	api.BaseResp

	Issue *jiraent.UnifiedIssue `json:"issue"`
}

type SyncIssueSnapshotByKeyRequest struct {
	Key string `json:"key" binding:"required"`
}

type SyncIssueSnapshotByKeyResponse struct {
	api.BaseResp

	Issue *jiraent.IssueInRepo `json:"issue"`
}

type SyncIssueSnapshotByJQLRequest struct {
	JQL      string `json:"jql" binding:"required"`
	MaxCount int    `json:"max_count"`
	FailFast bool   `json:"fail_fast"`
	PerPage  int    `json:"per_page"`
}

type SyncIssueSnapshotByJQLResponse struct {
	api.BaseResp

	Total         int      `json:"total"`
	SuccessIssues []string `json:"success_issues"`
	FailureIssues []string `json:"failure_issues"`
}

type UpsertIssueTriageRequest struct {
	Triage *jiraent.IssueTriage `json:"triage" binding:"required"`
}

type ListIssueTriageTagDefinitionsRequest struct {
	TypesIn           *[]jiraent.IssueTriageTagType `form:"types_in"`
	NamesIn           *[]string                     `form:"names_in"`
	LabelsContainJSON string                        `form:"labels_contain_json"`
	LabelsContain     map[string]string             `form:"-"`
}

type ListIssueTriageTagDefinitionsResponse struct {
	api.BaseResp

	Tags []*jiraent.IssueTriageTagDefinition `json:"tags"`
}

type CreateIssueTriageTagDefinitionRequest struct {
	Tag *jiraent.IssueTriageTagDefinition `json:"tag" binding:"required"`
}

type CreateIssueTriageTagDefinitionResponse struct {
	api.BaseResp

	Tag *jiraent.IssueTriageTagDefinition `json:"tag"`
}

type DeleteIssueTriageTagDefinitionRequest struct {
	Name string                     `json:"name" binding:"required"`
	Type jiraent.IssueTriageTagType `json:"type" binding:"required"`
}

type SetIssueTimelineSummaryRequest struct {
	Key     string                        `json:"key" binding:"required"`
	Summary *jiraent.IssueTimelineSummary `json:"summary" binding:"required"`
}

type ListIssuesFromJiraRequest struct {
	JQL         string `form:"jql" binding:"required"`
	WithComment bool   `form:"with_comment" default:"false"`
	PerPage     int    `form:"per_page" default:"50"`
	PageToken   string `form:"page_token"`
}

type ListIssuesFromJiraResponse struct {
	api.BaseResp

	Issues        []*jiraent.IssueInJira `json:"issues"`
	IsLast        bool                   `json:"is_last"`
	NextPageToken string                 `json:"next_page_token"`
}

type GetIssueFromJiraRequest struct {
	WithComments bool `form:"with_comments" default:"false"`
}

type GetIssueFromJiraResponse struct {
	api.BaseResp

	Issue *jiraent.IssueInJira `json:"issue"`
}
