package cvt

import (
	"encoding/json"
	"time"

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

type e2m struct{}

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

	var info *k8sent.K8sInfo
	if e.Info != nil {
		info = e.Info
	} else if e.K8sSnapshot != nil {
		info = e.K8sSnapshot
	}
	if info != nil {
		data, err := json.Marshal(info)
		if err != nil {
			panic(err)
		}
		m.K8sSnapshot = data
	}
	return m
}

func (cvt e2m) Task(e *k8sent.Task) *k8smod.Task {
	m := &k8smod.Task{
		Updatable: base.Updatable{
			Base: base.Base{ID: base.ID(e.ID)},
		},
		Name:                e.Name,
		CloudProvider:       e.CloudProvider,
		VersionToBeUpgraded: e.VersionToBeUpgraded,
		MaxRestartTimes:     e.MaxRestartTimes,
		Deadline:            time.Unix(e.Deadline, 0),
		Status:              string(e.Status),
		Applicant:           e.Applicant,
		ClosedAt:            cvtTsToTime(e.ClosedAt),
		ApprovalID:          e.ApprovalID,
		SelectorType:        e.SelectorType,
		SelectorValue:       e.SelectorValue,
		Synced:              e.Synced,
	}

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

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