package org.leumasjaffe.charsheet.model.features; import java.util.Collections; import java.util.List; import org.leumasjaffe.charsheet.model.DDCharacter; import org.leumasjaffe.charsheet.model.DDCharacterClass; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import lombok.experimental.FieldDefaults; import lombok.experimental.NonFinal; @JsonTypeInfo(use=Id.MINIMAL_CLASS) public interface DDPropertyChooser { default int getTimes() { return 1; } String getHeader(); default List getChoices() { return Collections.emptyList(); } public DDProperty get(int selectedIndex); default boolean applySideEffects(DDCharacter to, DDCharacterClass toClass, int selectedIndex) { toClass.addFeature(get(selectedIndex)); return true; } default void undoSideEffects(DDCharacter to, DDCharacterClass toClass, int selectedIndex) { toClass.removeFeature(get(selectedIndex)); } @RequiredArgsConstructor @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true) public static class State { DDCharacter ddCharacter; DDCharacterClass ddCharacterClass; DDPropertyChooser chooser; @NonFinal boolean hasApplied = false; @NonFinal int previousIndex = -1; public void apply(int selectedIndex) { if (hasApplied) { chooser.undoSideEffects(ddCharacter, ddCharacterClass, previousIndex); } hasApplied = chooser.applySideEffects(ddCharacter, ddCharacterClass, previousIndex = selectedIndex); } } }