package cvt

import (
	"encoding/json"
	"time"

	k8sent "github.com/tidbcloud/devops/entity/k8supgrade"
	k8smod "github.com/tidbcloud/devops/models/k8supgrade"
)

type m2e struct{}

func (cvt m2e) K8sCluster(m *k8smod.K8sCluster) *k8sent.K8sCluster {
	e := &k8sent.K8sCluster{
		ID:                     m.ID.Uint64(),
		Name:                   m.Name,
		CloudProvider:          m.CloudProvider,
		MaintenanceWindowID:    m.MaintenanceWindowID,
		TaskID:                 m.TaskID,
		UpgradeOperationCR:     m.UpgradeOperationCR,
		UpgradeOperationStatus: m.UpgradeOperationStatus,
		IsExcluded:             m.IsExcluded,
		DesiredVersion:         m.DesiredVersion,
		DisableAutoGeneration:  m.DisableAutoGeneration,
		TenantKind:             m.TenantKind,
		TenantName:             m.TenantName,
		BusinessRegion:         m.BusinessRegion,
		Region:                 m.Region,
		Version:                m.Version,
	}

	if len(m.K8sSnapshot) > 0 {
		snapshot := new(k8sent.K8sInfo)
		if err := json.Unmarshal(m.K8sSnapshot, snapshot); err != nil {
			panic(err)
		}
		e.K8sSnapshot = snapshot
	}
	return e
}

func (cvt m2e) Task(m *k8smod.Task) *k8sent.Task {
	e := &k8sent.Task{
		ID:                  m.ID.Uint64(),
		Name:                m.Name,
		CloudProvider:       m.CloudProvider,
		VersionToBeUpgraded: m.VersionToBeUpgraded,
		MaxRestartTimes:     m.MaxRestartTimes,
		Deadline:            m.Deadline.Unix(),
		CreatedAt:           m.CreatedAt.Unix(),
		Status:              k8sent.TaskStatus(m.Status),
		Applicant:           m.Applicant,
		ClosedAt:            cvtTimeToTs(m.ClosedAt),
		ApprovalID:          m.ApprovalID,
		SelectorType:        m.SelectorType,
		SelectorValue:       m.SelectorValue,
		Synced:              m.Synced,
	}
	if m.Regions != nil {
		regions := map[string]int64{}
		if err := json.Unmarshal(m.Regions, &regions); err != nil {
			panic(err)
		}
		e.Regions = regions
	}
	return e
}

func cvtTimeToTs(t *time.Time) *int64 {
	if t == nil {
		return nil
	}
	ts := t.Unix()
	return &ts
}
