package ticket

import "encoding/json"

type JiraIssueCustomerDeploymentModel string

const (
	IssueCustomerDeploymentModelCloud     JiraIssueCustomerDeploymentModel = "cloud"
	IssueCustomerDeploymentModelOnPremise JiraIssueCustomerDeploymentModel = "on_premise"
)

type JiraIssueCustomerInfo struct {
	IssueKey        string                           `json:"issue_key"`
	DeploymentModel JiraIssueCustomerDeploymentModel `json:"deploy_model"`
	Environment     *string                          `json:"environment,omitempty"`
	ClusterID       *string                          `json:"cluster_id,omitempty"`
	TenantID        *string                          `json:"tenant_id,omitempty"` // op: account id, cloud: org id
	TenantAlias     *string                          `json:"tenant_alias,omitempty"`
	TenantRegion    *string                          `json:"tenant_region,omitempty"`
	OPAccountLevel  *string                          `json:"account_level,omitempty"` // only set for op.
}

type JiraIssueCustomFields struct {
	TiDBCloudClusterType  *string         `json:"tidb_cloud_cluster_type,omitempty"`
	OnCallTier            *string         `json:"on_call_tier,omitempty"`
	AutoOncallStatus      *string         `json:"auto_oncall_status,omitempty"`
	EscalationSummary     *string         `json:"escalation_summary,omitempty"`
	EscalationDescription json.RawMessage `json:"escalation_description,omitempty" swaggertype:"object"`
	Severity              *string         `json:"severity,omitempty"`
	AlertRequired         *string         `json:"alert_required,omitempty"`
}

type JiraUser struct {
	AccountID   string `json:"account_id"`
	Email       string `json:"email"`
	DisplayName string `json:"display_name"`
	Active      bool   `json:"active"`
}

type JiraProject struct {
	Name string `json:"name"`
	Key  string `json:"key"`
}

type JiraIssueLink struct {
	TypeName        string  `json:"type_name"`
	Inward          string  `json:"inward,omitempty"`
	Outward         string  `json:"outward,omitempty"`
	InwardIssueKey  *string `json:"inward_issue,omitempty"`
	OutwardIssueKey *string `json:"outward_issue,omitempty"`
}

type JiraIssueVersion struct {
	ID   string `json:"id"`
	Name string `json:"name"`
}

type JiraIssueAttachment struct {
	ID       string `json:"id"`
	Filename string `json:"filename"`
}

type JiraComment struct {
	ID        string    `json:"id"`
	CreatedAt int64     `json:"created_at"`
	UpdatedAt int64     `json:"updated_at"`
	Author    *JiraUser `json:"author"`
	Content   string    `json:"content"`
}

type JiraIssueComputedFields struct {
	ResponseSLADueAt *int64 `json:"response_sla_due_at,omitempty"` // nil means not supported, 0 means unlimited.
}

// JiraIssue represents the issue structure fetched from Jira API
type JiraIssue struct {
	ID              string                  `json:"id"` // raw ID in jira
	Key             string                  `json:"key"`
	Summary         string                  `json:"summary"`
	Status          string                  `json:"status"`
	CreatedAt       int64                   `json:"created_at"`
	UpdatedAt       int64                   `json:"updated_at"`
	ResolvedAt      *int64                  `json:"resolved_at,omitempty"`
	Description     string                  `json:"description"`
	Environment     string                  `json:"environment,omitempty"`
	Priority        string                  `json:"priority"`
	Project         JiraProject             `json:"project"`
	Assignee        *JiraUser               `json:"assignee"`
	L2Assignee      *JiraUser               `json:"l2_assignee,omitempty"`
	Reporter        *JiraUser               `json:"reporter"`
	Components      []string                `json:"components,omitempty"`
	Labels          []string                `json:"labels,omitempty"`
	IssueLinks      []JiraIssueLink         `json:"issue_links"`
	ParentKey       *string                 `json:"parent_key,omitempty"`
	SubtaskKeys     []string                `json:"subtask_keys,omitempty"`
	AffectsVersions []JiraIssueVersion      `json:"affects_versions,omitempty"`
	CustomFields    JiraIssueCustomFields   `json:"custom_fields,omitempty"`
	CustomerInfo    *JiraIssueCustomerInfo  `json:"customer_info,omitempty"`
	ComputedFields  JiraIssueComputedFields `json:"computed_fields,omitempty"`

	// optional fields, nil means not fetch
	Attachments []JiraIssueAttachment `json:"attachments,omitempty"`
	Comments    []JiraComment         `json:"comments,omitempty"`
}
