package dispatch

import "time"

type (
	InsightTier              string
	InsightCoverageStatus    string
	InsightObservationStatus string
)

const (
	InsightTierL1 InsightTier = "L1"
	InsightTierL2 InsightTier = "L2"
	InsightTierL3 InsightTier = "L3"

	InsightCoverageStatusCovered                   InsightCoverageStatus = "covered"
	InsightCoverageStatusNoTrigger                 InsightCoverageStatus = "no_trigger"
	InsightCoverageStatusNoExecution               InsightCoverageStatus = "no_execution"
	InsightCoverageStatusExecutionInProgress       InsightCoverageStatus = "execution_in_progress"
	InsightCoverageStatusExecutionFailed           InsightCoverageStatus = "execution_failed"
	InsightCoverageStatusNoSuccessfulAssign        InsightCoverageStatus = "no_successful_assign"
	InsightCoverageStatusJiraAssignmentUnconfirmed InsightCoverageStatus = "jira_assignment_unconfirmed"
	InsightCoverageStatusJiraChangelogError        InsightCoverageStatus = "jira_changelog_error"

	InsightObservationStatusPending       InsightObservationStatus = "pending"
	InsightObservationStatusNotReassigned InsightObservationStatus = "not_reassigned"
	InsightObservationStatusReassigned    InsightObservationStatus = "reassigned"
)

type InsightRate struct {
	Numerator   int      `json:"numerator"`
	Denominator int      `json:"denominator"`
	Rate        *float64 `json:"rate"`
}

type InsightSummary struct {
	TotalIssues              int         `json:"total_issues"`
	JiraCoverage             InsightRate `json:"jira_coverage"`
	DispatchRouteCoverage    InsightRate `json:"dispatch_route_coverage"`
	ProxyAccuracy2H          InsightRate `json:"proxy_accuracy_2h"`
	ProxyAccuracy24H         InsightRate `json:"proxy_accuracy_24h"`
	PendingObservationIssues int         `json:"pending_observation_issues"`
	UnknownIssues            int         `json:"unknown_issues"`
}

type InsightProjectBreakdown struct {
	ProjectKey string      `json:"project_key"`
	Total      int         `json:"total"`
	Covered    int         `json:"covered"`
	Uncovered  int         `json:"uncovered"`
	Unknown    int         `json:"unknown"`
	Coverage   InsightRate `json:"coverage"`
}

type InsightReassignment struct {
	At          time.Time `json:"at"`
	From        string    `json:"from,omitempty"`
	To          string    `json:"to,omitempty"`
	Author      string    `json:"author,omitempty"`
	ElapsedSecs int64     `json:"elapsed_secs"`
}

type InsightAssignment struct {
	Tier              InsightTier              `json:"tier"`
	PolicyID          uint64                   `json:"policy_id"`
	PolicyName        string                   `json:"policy_name"`
	PolicyVersion     *int                     `json:"policy_version,omitempty"`
	RuleID            uint64                   `json:"rule_id"`
	RuleName          string                   `json:"rule_name"`
	ExecutionID       uint64                   `json:"execution_id"`
	SelectedAssignee  string                   `json:"selected_assignee"`
	ActionCompletedAt time.Time                `json:"action_completed_at"`
	JiraFieldID       string                   `json:"jira_field_id"`
	JiraAssignee      string                   `json:"jira_assignee,omitempty"`
	JiraAssignedAt    *time.Time               `json:"jira_assigned_at,omitempty"`
	Observation2H     InsightObservationStatus `json:"observation_2h"`
	Observation24H    InsightObservationStatus `json:"observation_24h"`
	FirstReassignment *InsightReassignment     `json:"first_reassignment,omitempty"`
	ReassignmentCount int                      `json:"reassignment_count"`
}

type InsightIssue struct {
	IssueKey       string                `json:"issue_key"`
	ProjectKey     string                `json:"project_key"`
	CreatedAt      time.Time             `json:"created_at"`
	ExpectedTiers  []InsightTier         `json:"expected_tiers"`
	CoverageStatus InsightCoverageStatus `json:"coverage_status"`
	CoverageReason string                `json:"coverage_reason"`
	TriggerIDs     []uint64              `json:"trigger_ids"`
	ExecutionIDs   []uint64              `json:"execution_ids"`
	Assignments    []InsightAssignment   `json:"assignments"`
}

type Insight struct {
	Date        string                    `json:"date"`
	Timezone    string                    `json:"timezone"`
	GeneratedAt time.Time                 `json:"generated_at"`
	Summary     InsightSummary            `json:"summary"`
	Projects    []InsightProjectBreakdown `json:"projects"`
	Issues      []InsightIssue            `json:"issues"`
	Warnings    []string                  `json:"warnings"`
}
