package cvt

import (
	"encoding/json"
	"time"

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

type e2m struct{}

func (cvt e2m) IssueInRepo(e *jiraent.IssueInRepo) *jiramod.Issue {
	m := &jiramod.Issue{
		Key:                 e.Key,
		CreatedAt:           nil,
		StoredAt:            time.Now(),
		HaveTriage:          e.HaveTriage,
		HaveTimelineSummary: e.HaveTimelineSummary,
	}

	if e.Snapshot != nil {
		m.Snapshot = cvt.IssueSnapshot(e.Snapshot)
		m.CreatedAt = timeutil.TsToTime(&e.Snapshot.CreatedAt)
	}

	return m

}

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

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

	return m
}

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

	return m
}

func (cvt e2m) IssueTriage(e *jiraent.IssueTriage) *jiramod.IssueTriage {
	m := &jiramod.IssueTriage{
		Key:          e.Key,
		BriefSummary: e.BriefSummary,
		Tags: jiramod.IssueTriageTags{
			Scene:          e.Tags.Scene,
			RootCause:      e.Tags.RootCause,
			Preventability: e.Tags.Preventability,
			Solution:       e.Tags.Solution,
		},
	}
	return m
}

func (cvt e2m) IssueTriageTagDefinition(e *jiraent.IssueTriageTagDefinition) *jiramod.IssueTriageTagDefinition {
	m := &jiramod.IssueTriageTagDefinition{
		Name:        e.Name,
		Type:        string(e.Type),
		Description: e.Description,
	}

	if e.Labels != nil {
		data, err := json.Marshal(e.Labels)
		if err != nil {
			panic(e)
		}
		m.Labels = data
	}

	return m
}
