package cvt

import (
	"encoding/json"
	"fmt"

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

type m2e struct{}

func (cvt m2e) Deployment(m *depmod.Deployment) (*cp.Deployment, error) {
	e := &cp.Deployment{
		ID:        m.ID.Uint64(),
		Scenario:  cp.Scenario(m.Scenario),
		Phase:     cp.Phase(m.Phase),
		Applicant: m.Applicant,
		CreatedAt: m.CreatedAt.Unix(),
	}

	if m.Params != nil {
		var params map[string]string
		if err := json.Unmarshal(m.Params, &params); err != nil {
			return nil, fmt.Errorf("failed to unmarshal params: %w", err)
		}
		e.Params = params
	}
	if len(m.FrozenSnapshot) > 0 {
		var snap cp.FrozenSnapshot
		if err := json.Unmarshal(m.FrozenSnapshot, &snap); err != nil {
			return nil, fmt.Errorf("failed to unmarshal frozen_snapshot: %w", err)
		}
		e.FrozenSnapshot = &snap
	}
	if len(m.PreviewMeta) > 0 {
		var meta cp.WorkflowRunMeta
		if err := json.Unmarshal(m.PreviewMeta, &meta); err != nil {
			return nil, fmt.Errorf("failed to unmarshal preview_meta: %w", err)
		}
		e.PreviewMeta = &meta
	}
	if len(m.ApplyMeta) > 0 {
		var meta cp.WorkflowRunMeta
		if err := json.Unmarshal(m.ApplyMeta, &meta); err != nil {
			return nil, fmt.Errorf("failed to unmarshal apply_meta: %w", err)
		}
		e.ApplyMeta = &meta
	}
	if m.ApprovalID != nil {
		e.ApprovalID = pointer.Pointer(m.ApprovalID.Uint64())
	}
	if m.ClosedAt != nil {
		e.ClosedAt = pointer.Pointer(m.ClosedAt.Unix())
	}

	return e, nil
}
