package cvt

import (
	"encoding/json"

	ent "github.com/tidbcloud/devops/entity/kernelimage"
	"github.com/tidbcloud/devops/models/base"
	mod "github.com/tidbcloud/devops/models/kernelimage"
)

type e2m struct{}

func (e2m) Release(e *ent.Release) *mod.Release {
	var deliveryTargetImages []byte
	if e.DeliveryTargetImages != nil {
		var err error
		deliveryTargetImages, err = json.Marshal(e.DeliveryTargetImages)
		if err != nil {
			panic(err)
		}
	}
	var availabilitySnapshot []byte
	if e.Availability != nil {
		var err error
		availabilitySnapshot, err = json.Marshal(e.Availability)
		if err != nil {
			panic(err)
		}
	}
	m := &mod.Release{
		ArtifactUID:                 e.ArtifactUID,
		LocalDevOpsEnv:              e.LocalDevOpsEnv,
		Version:                     e.Version,
		Repo:                        e.Repo,
		Branch:                      e.Branch,
		CommitSHA:                   e.CommitSHA,
		GitTag:                      e.GitTag,
		SourceRepository:            e.SourceRepository,
		SourceTag:                   e.SourceTag,
		SourceDigest:                e.SourceDigest,
		Status:                      string(e.Status),
		Masked:                      e.Masked,
		MaskReason:                  e.MaskReason,
		SourceApplicant:             e.SourceApplicant,
		SourceReleaseID:             e.SourceReleaseID,
		SourceChangeID:              e.SourceChangeID,
		DeliveryOperationInstanceID: toModelID(e.DeliveryOperationInstanceID),
		FormalDeliveryUID:           e.FormalDeliveryUID,
		DeliveryBatchUID:            e.DeliveryBatchUID,
		DeliveryTargetImages:        deliveryTargetImages,
		AvailabilityStatus:          string(e.AvailabilityStatus),
		AvailabilitySnapshot:        availabilitySnapshot,
		AvailabilityCheckUID:        e.AvailabilityCheckUID,
		AvailabilityCheckStartedAt:  e.AvailabilityCheckStartedAt,
		AvailabilityCheckedAt:       e.AvailabilityCheckedAt,
		AvailabilityLastError:       e.AvailabilityLastError,
		LastErrorCode:               e.LastErrorCode,
		LastErrorMessage:            e.LastErrorMessage,
		BuildFinishedAt:             e.BuildFinishedAt,
		AvailableAt:                 e.AvailableAt,
	}
	m.ID = base.ID(e.ID)
	m.CreatedAt = e.CreatedAt
	m.UpdatedAt = e.UpdatedAt
	return m
}

func toModelID(id *uint64) *base.ID {
	if id == nil {
		return nil
	}
	result := base.ID(*id)
	return &result
}
