package planmanage

import (
	"encoding/json"

	"github.com/tidbcloud/AgentTeam/internal/store/workflow/plan"
)

func storeActor(value Actor) plan.Actor {
	return plan.Actor{Type: value.Type, ID: value.ID, MemberID: value.MemberID}
}

func actorFromStore(value plan.Actor) Actor {
	return Actor{Type: value.Type, ID: value.ID, MemberID: value.MemberID}
}

func planFromStore(value plan.Plan) Plan {
	result := Plan{
		ID: value.ID, WorkspaceID: value.WorkspaceID, ScopeID: value.ScopeID, Key: value.PlanKey,
		DisplayName: value.DisplayName, DescriptionMD: value.DescriptionMD,
		State: PlanState(value.State), Revision: value.Revision,
		CreatedBy: actorFromStore(value.CreatedBy), CreatedAt: value.CreatedAt,
		UpdatedBy: actorFromStore(value.UpdatedBy), UpdatedAt: value.UpdatedAt,
		ArchivedAt: value.ArchivedAt,
	}
	if value.CurrentVersion != nil {
		result.CurrentVersion = &VersionRef{ID: value.CurrentVersion.ID}
	}
	if value.DefaultVersion != nil {
		result.DefaultVersion = &VersionRef{ID: value.DefaultVersion.ID}
	}
	if value.ArchivedBy != nil {
		actor := actorFromStore(*value.ArchivedBy)
		result.ArchivedBy = &actor
	}
	return result
}

func draftFromStore(value plan.PlanDraft) Draft {
	return Draft{
		PlanID: value.PlanID, WorkspaceID: value.WorkspaceID, Source: value.Source,
		Layout: json.RawMessage(value.Layout), Revision: value.Revision,
		UpdatedBy: actorFromStore(value.UpdatedBy), CreatedAt: value.CreatedAt, UpdatedAt: value.UpdatedAt,
	}
}

func versionFromStore(value plan.PlanVersion) Version {
	return Version{
		ID: value.ID, WorkspaceID: value.WorkspaceID, PlanID: value.PlanID,
		DraftRevision: value.DraftRevision, SourceVersionID: value.SourceVersionID,
		Source: value.Source, Layout: json.RawMessage(value.Layout), Artifact: json.RawMessage(value.Artifact),
		CompilerVersion: value.CompilerVersion, Digest: value.Digest,
		PublishedBy: actorFromStore(value.PublishedBy), PublishedByDisplayName: value.PublishedByDisplayName,
		PublishedAt: value.PublishedAt,
	}
}

func versionSummaryFromStore(value plan.PlanVersionSummary) VersionSummary {
	return VersionSummary{
		ID: value.ID, WorkspaceID: value.WorkspaceID, PlanID: value.PlanID,
		DraftRevision: value.DraftRevision, SourceVersionID: value.SourceVersionID,
		CompilerVersion: value.CompilerVersion, Digest: value.Digest,
		PublishedBy: actorFromStore(value.PublishedBy), PublishedByDisplayName: value.PublishedByDisplayName,
		PublishedAt: value.PublishedAt,
	}
}
