package cvt

import (
	"encoding/json"
	"fmt"
	"time"

	cp "github.com/tidbcloud/devops/entity/controlplane"
	"github.com/tidbcloud/devops/models/base"
	depmod "github.com/tidbcloud/devops/models/controlplane"
	"github.com/tidbcloud/devops/pkg/infra/utils/pointer"
)

type e2m struct{}

func (cvt e2m) Deployment(e *cp.Deployment) (*depmod.Deployment, error) {
	m := &depmod.Deployment{
		Updatable: base.Updatable{
			Base: base.Base{ID: base.ID(e.ID)},
		},
		Scenario:  string(e.Scenario),
		Phase:     string(e.Phase),
		Applicant: e.Applicant,
	}

	params, err := json.Marshal(e.Params)
	if err != nil {
		return nil, fmt.Errorf("failed to marshal params: %w", err)
	}
	m.Params = params

	if e.FrozenSnapshot != nil {
		data, err := json.Marshal(e.FrozenSnapshot)
		if err != nil {
			return nil, fmt.Errorf("failed to marshal frozen_snapshot: %w", err)
		}
		m.FrozenSnapshot = data
	}
	if e.PreviewMeta != nil {
		data, err := json.Marshal(e.PreviewMeta)
		if err != nil {
			return nil, fmt.Errorf("failed to marshal preview_meta: %w", err)
		}
		m.PreviewMeta = data
	}
	if e.ApplyMeta != nil {
		data, err := json.Marshal(e.ApplyMeta)
		if err != nil {
			return nil, fmt.Errorf("failed to marshal apply_meta: %w", err)
		}
		m.ApplyMeta = data
	}
	if e.ApprovalID != nil {
		m.ApprovalID = pointer.Pointer(base.ID(*e.ApprovalID))
	}
	if e.ClosedAt != nil {
		t := time.Unix(*e.ClosedAt, 0)
		m.ClosedAt = &t
	}

	return m, nil
}
