package cvt

import (
	"encoding/json"

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

type m2e struct{}

func (m2e) Release(m *mod.Release) *ent.Release {
	var deliveryTargetImages []string
	if len(m.DeliveryTargetImages) > 0 {
		if err := json.Unmarshal(m.DeliveryTargetImages, &deliveryTargetImages); err != nil {
			panic(err)
		}
	}
	var availability []*ent.PlatformAvailability
	if len(m.AvailabilitySnapshot) > 0 {
		if err := json.Unmarshal(m.AvailabilitySnapshot, &availability); err != nil {
			panic(err)
		}
	}
	return &ent.Release{
		ID:                          m.ID.Uint64(),
		ArtifactUID:                 m.ArtifactUID,
		LocalDevOpsEnv:              m.LocalDevOpsEnv,
		Version:                     m.Version,
		Repo:                        m.Repo,
		Branch:                      m.Branch,
		CommitSHA:                   m.CommitSHA,
		GitTag:                      m.GitTag,
		SourceRepository:            m.SourceRepository,
		SourceTag:                   m.SourceTag,
		SourceDigest:                m.SourceDigest,
		Status:                      ent.ReleaseStatus(m.Status),
		Masked:                      m.Masked,
		MaskReason:                  m.MaskReason,
		SourceApplicant:             m.SourceApplicant,
		SourceReleaseID:             m.SourceReleaseID,
		SourceChangeID:              m.SourceChangeID,
		DeliveryOperationInstanceID: toEntityID(m.DeliveryOperationInstanceID),
		FormalDeliveryUID:           m.FormalDeliveryUID,
		DeliveryBatchUID:            m.DeliveryBatchUID,
		DeliveryTargetImages:        deliveryTargetImages,
		AvailabilityStatus:          ent.AvailabilityStatus(m.AvailabilityStatus),
		Availability:                availability,
		AvailabilityCheckUID:        m.AvailabilityCheckUID,
		AvailabilityCheckStartedAt:  m.AvailabilityCheckStartedAt,
		AvailabilityCheckedAt:       m.AvailabilityCheckedAt,
		AvailabilityLastError:       m.AvailabilityLastError,
		LastErrorCode:               m.LastErrorCode,
		LastErrorMessage:            m.LastErrorMessage,
		BuildFinishedAt:             m.BuildFinishedAt,
		AvailableAt:                 m.AvailableAt,
		CreatedAt:                   m.CreatedAt,
		UpdatedAt:                   m.UpdatedAt,
	}
}

func toEntityID[T ~uint64](id *T) *uint64 {
	if id == nil {
		return nil
	}
	result := uint64(*id)
	return &result
}
