package cvt

import (
	"encoding/json"

	jiraent "github.com/tidbcloud/devops/entity/jira"
	jiramod "github.com/tidbcloud/devops/models/jira"
	timeutil "github.com/tidbcloud/devops/pkg/infra/utils/time"
)

type m2e struct{}

func (cvt m2e) IssueInRepo(m *jiramod.Issue) *jiraent.IssueInRepo {
	e := &jiraent.IssueInRepo{
		Key:                 m.Key,
		CreatedAt:           m.CreatedAt.Unix(),
		StoredAt:            timeutil.TimeToTs(&m.StoredAt),
		HaveTriage:          m.HaveTriage,
		HaveTimelineSummary: m.HaveTimelineSummary,
	}

	if m.Snapshot != nil {
		e.Snapshot = cvt.IssueSnapshot(m.Snapshot)
	}

	return e
}

func (cvt m2e) IssueSnapshot(m *jiramod.IssueSnapshot) *jiraent.IssueSnapshot {
	e := &jiraent.IssueSnapshot{
		Key:           m.Key,
		ID:            m.ID,
		Summary:       m.Summary,
		Status:        m.Status,
		Priority:      m.Priority,
		CreatedAt:     m.CreatedAt.Unix(),
		ResolvedAt:    timeutil.TimeToTs(m.ResolvedAt),
		AssigneeEmail: m.AssigneeEmail,
		ReporterEmail: m.ReporterEmail,
		ProjectKey:    m.ProjectKey,
		Components:    m.Components,
	}

	if m.CustomerInfo != nil {
		e.CustomerInfo = cvt.IssueCustomerInfo(m.CustomerInfo)
	}

	return e
}

func (cvt m2e) IssueCustomerInfo(m *jiramod.IssueCustomerInfo) *jiraent.IssueCustomerInfo {
	e := &jiraent.IssueCustomerInfo{
		IssueKey:    m.IssueKey,
		Environment: jiraent.IssueCustomerEnvironment(m.Environment),
		ClusterID:   m.ClusterID,
		TenantID:    m.TenantID,
	}

	return e
}

func (cvt m2e) IssueTriage(m *jiramod.IssueTriage) *jiraent.IssueTriage {
	e := &jiraent.IssueTriage{
		Key:          m.Key,
		CreatedAt:    m.CreatedAt.Unix(),
		UpdatedAt:    timeutil.TimeToTs(m.UpdatedAt),
		BriefSummary: m.BriefSummary,
		Tags: jiraent.IssueTriageTags{
			Scene:          m.Tags.Scene,
			RootCause:      m.Tags.RootCause,
			Preventability: m.Tags.Preventability,
			Solution:       m.Tags.Solution,
		},
	}

	return e
}

func (cvt m2e) IssueTriageTagDefinition(m *jiramod.IssueTriageTagDefinition) *jiraent.IssueTriageTagDefinition {
	e := &jiraent.IssueTriageTagDefinition{
		Name:        m.Name,
		CreatedAt:   m.CreatedAt.Unix(),
		Type:        jiraent.IssueTriageTagType(m.Type),
		Description: m.Description,
	}

	if m.Labels != nil {
		labels := map[string]string{}
		if err := json.Unmarshal(m.Labels, &labels); err != nil {
			panic(err)
		}
		e.Labels = labels
	}

	return e
}
