package tc.oc.pgm.modes;
import java.time.Duration;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import javax.inject.Inject;
import com.google.inject.ImplementedBy;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.TranslatableComponent;
import org.bukkit.material.MaterialData;
import tc.oc.commons.bukkit.localization.BukkitTranslator;
import tc.oc.commons.bukkit.localization.MessageTemplate;
import tc.oc.pgm.features.FeatureDefinition;
import tc.oc.pgm.features.FeatureDefinitionContext;
import tc.oc.pgm.features.FeatureInfo;
import tc.oc.pgm.map.MapRootParser;
import tc.oc.pgm.xml.InvalidXMLException;
import tc.oc.pgm.xml.validate.DurationIs;
import tc.oc.pgm.xml.validate.MaterialDataIs;
@FeatureInfo(name = "mode")
@ImplementedBy(ObjectiveModeImpl.class)
public interface ObjectiveMode extends FeatureDefinition {
@Property
@Validate(DurationIs.NotNegative.class)
Duration after();
@Property
@Validate(DurationIs.NotNegative.class)
default Duration show_before() {
return boss_bar() ? Duration.ofSeconds(60) : Duration.ZERO;
}
@Property
@Legacy
default boolean boss_bar() {
return true;
}
@Property
@Validate(MaterialDataIs.Block.class)
MaterialData material();
@Property
Optional<MessageTemplate> name();
BaseComponent materialName();
}
abstract class ObjectiveModeImpl extends FeatureDefinition.Impl implements ObjectiveMode {
private BaseComponent materialName;
@Inject private void init(BukkitTranslator bukkitTranslator) throws InvalidXMLException {
materialName = new TranslatableComponent(
bukkitTranslator.materialKey(material())
.orElseThrow(() -> new InvalidXMLException("No localized name for material " + material()))
);
}
@Override
public BaseComponent materialName() {
return materialName;
}
}
class ObjectiveModeValidator implements MapRootParser {
final List<ObjectiveMode> modes;
final FeatureDefinitionContext features;
@Inject ObjectiveModeValidator(List<ObjectiveMode> modes, FeatureDefinitionContext features) {
this.modes = modes;
this.features = features;
}
@Override
public void parse() throws InvalidXMLException {
final Set<Duration> times = new HashSet<>();
for(ObjectiveMode mode : modes) {
if(!times.add(mode.after())) {
throw new InvalidXMLException("Duplicate mode change time",
features.definitionNode(mode));
}
}
}
}