package ticket

import (
	"encoding/json"
	"testing"

	"github.com/stretchr/testify/require"
)

func TestJiraIssueCustomerInfoDeploymentModelJSON(t *testing.T) {
	t.Parallel()

	environment := "production"
	payload, err := json.Marshal(JiraIssueCustomerInfo{
		IssueKey:        "TCOC-1",
		DeploymentModel: IssueCustomerDeploymentModelCloud,
		Environment:     &environment,
	})
	require.NoError(t, err)

	var fields map[string]any
	require.NoError(t, json.Unmarshal(payload, &fields))
	require.Equal(t, "cloud", fields["deploy_model"])
	require.Equal(t, "production", fields["environment"])

	var info JiraIssueCustomerInfo
	require.NoError(t, json.Unmarshal([]byte(`{"issue_key":"APID-1","deploy_model":"on_premise","environment":"staging"}`), &info))
	require.Equal(t, IssueCustomerDeploymentModelOnPremise, info.DeploymentModel)
	require.Equal(t, "staging", *info.Environment)

	info = JiraIssueCustomerInfo{}
	require.NoError(t, json.Unmarshal([]byte(`{"issue_key":"TCOC-2","environment":"cloud"}`), &info))
	require.Empty(t, info.DeploymentModel)
	require.Equal(t, "cloud", *info.Environment)
}

func TestJiraIssueCustomFieldsJSON(t *testing.T) {
	t.Parallel()

	payload, err := json.Marshal(JiraIssue{
		Key: "APID-1",
		CustomFields: JiraIssueCustomFields{
			AutoOncallStatus:      stringPointer("Succeeded"),
			EscalationSummary:     stringPointer("Escalation summary"),
			EscalationDescription: json.RawMessage(`{"type":"doc","content":[]}`),
			Severity:              stringPointer("S1"),
			AlertRequired:         stringPointer("Yes"),
		},
	})
	require.NoError(t, err)

	var fields map[string]any
	require.NoError(t, json.Unmarshal(payload, &fields))
	require.NotContains(t, fields, "escalation")
	require.Equal(t, map[string]any{
		"auto_oncall_status":     "Succeeded",
		"escalation_summary":     "Escalation summary",
		"escalation_description": map[string]any{"type": "doc", "content": []any{}},
		"severity":               "S1",
		"alert_required":         "Yes",
	}, fields["custom_fields"])
}

func TestJiraIssueLabelsJSON(t *testing.T) {
	t.Parallel()

	payload, err := json.Marshal(JiraIssue{Key: "APID-1", Labels: []string{"customer-impact", "cloud"}})
	require.NoError(t, err)

	var fields map[string]any
	require.NoError(t, json.Unmarshal(payload, &fields))
	require.Equal(t, []any{"customer-impact", "cloud"}, fields["labels"])
}

func stringPointer(value string) *string {
	return &value
}
