WorkflowStepTranslationService.java

/*
 * Copyright 2026 Global Crop Diversity Trust
 * Licensed under the Apache License, Version 2.0
 * See LICENSE file in project root folder or http://www.apache.org/licenses/LICENSE-2.0
 */

package org.gringlobal.service;

import org.gringlobal.model.workflow.WorkflowActionStep;
import org.gringlobal.model.workflow.WorkflowActionStepLang;
import org.gringlobal.model.workflow.WorkflowEndStep;
import org.gringlobal.model.workflow.WorkflowEndStepLang;
import org.gringlobal.model.workflow.WorkflowStartStep;
import org.gringlobal.model.workflow.WorkflowStartStepLang;
import org.gringlobal.model.workflow.WorkflowStep;
import org.gringlobal.model.workflow.WorkflowStepLang;
import org.gringlobal.service.filter.WorkflowStepFilter;

import lombok.NoArgsConstructor;

/**
 * Translation service for WorkflowStep.
 */
public interface WorkflowStepTranslationService extends TranslationService<WorkflowStep, WorkflowStepLang, WorkflowStepTranslationService.TranslatedWorkflowStep<WorkflowStep, WorkflowStepLang>, WorkflowStepFilter> {

	abstract class TranslatedWorkflowStep<T extends WorkflowStep, L extends WorkflowStepLang> extends TranslationService.Translation<WorkflowStep, WorkflowStepLang> {
		private static final long serialVersionUID = -1827365123498127364L;

		@SuppressWarnings("unchecked")
		public static <T extends WorkflowStep, L extends WorkflowStepLang> TranslatedWorkflowStep<T, L> from(T step, String title, String description, L def, L lang) {
			if (step instanceof WorkflowActionStep) {
				String conditionMessage = null;
				String actionNote = null;
				// if (lang instanceof WorkflowActionStepLang && def instanceof WorkflowActionStepLang) {
					var asLang = (WorkflowActionStepLang) lang;
					var asDef = (WorkflowActionStepLang) def;
					conditionMessage = asLang != null ? asLang.getConditionMessage() : asDef != null ? asDef.getConditionMessage() : null;
					actionNote = asLang != null ? asLang.getActionNote() : asDef != null ? asDef.getActionNote() : null;
				// }
				var t = new TranslatedWorkflowActionStep((WorkflowActionStep) step);
				t.title = title;
				t.description = description;
				t.conditionMessage = conditionMessage;
				t.actionNote = actionNote;
				return (TranslatedWorkflowStep<T, L>) t;
			} else if (step instanceof WorkflowEndStep) {
				var t = new TranslatedWorkflowEndStep((WorkflowEndStep) step);
				t.title = title;
				t.description = description;
				return (TranslatedWorkflowStep<T, L>) t;
			} else if (step instanceof WorkflowStartStep) {
				var t = new TranslatedWorkflowStartStep((WorkflowStartStep) step);
				t.title = title;
				t.description = description;
				return (TranslatedWorkflowStep<T, L>) t;
			}
			throw new RuntimeException("Cannot");
		}

		@Override
		public WorkflowStepLang updateLang(WorkflowStepLang target) {
			return super.updateLang(target);
		}
	}

	@NoArgsConstructor
	class TranslatedWorkflowActionStep extends TranslatedWorkflowStep<WorkflowActionStep, WorkflowActionStepLang> {

		public String conditionMessage;
		public String actionNote;

		public TranslatedWorkflowActionStep(WorkflowActionStep entity) {
			this.entity = entity;
		}

		@Override
		public WorkflowStepLang updateLang(WorkflowStepLang target) {
			super.updateLang(target);
			if (target instanceof WorkflowActionStepLang) {
				((WorkflowActionStepLang)target).setConditionMessage(conditionMessage);
				((WorkflowActionStepLang)target).setActionNote(actionNote);
			}
			return target;
		}
	}

	@NoArgsConstructor
	class TranslatedWorkflowStartStep extends TranslatedWorkflowStep<WorkflowStartStep, WorkflowStartStepLang> {
		public TranslatedWorkflowStartStep(WorkflowStartStep entity) {
			this.entity = entity;
		}

	}

	@NoArgsConstructor
	class TranslatedWorkflowEndStep extends TranslatedWorkflowStep<WorkflowEndStep, WorkflowEndStepLang> {
		public TranslatedWorkflowEndStep(WorkflowEndStep entity) {
			this.entity = entity;
		}

	}
}